CONNECT 属性示例:演示连接点的实现和使用

更新:2007 年 11 月

CONNECT 属性示例阐释如何在多线程环境中实现和使用连接点(IConnectionPointContainerIConnectionPoint 接口)。

该示例说明包含 support_errorinfo、event_source 和 event_receiver 的若干个常用的 IDL 属性、COM 属性和编译器属性。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行此示例

  1. 打开解决方案文件 connect.sln。

  2. 在“生成”菜单中,单击“生成解决方案”。

  3. 选择要运行的客户端(Drive 或 MDrive)并使其成为启动项目(右击项目文件夹并单击“设为启动项目”)。有关客户端的更多信息可以在“示例的工作机制”部分中找到。

  4. 在“调试”菜单中,单击“开始执行(不调试)”。

示例的工作机制

服务器在 Connect.dll 中实现。此 DLL 允许创建由 CRandom C++ 类实现的 CoRandom COM 对象。COM 对象支持 IRandom(双重接口)和 IConnectionPointContainer,并且接受 IRandomEvent 接口的连接。

IRandom 接口支持下列方法:

  • Start — 启动对象内部的线程

  • Stop — 停止对象内部的线程

  • StopAll — 停止所有正在运行的线程

对象内部的辅助线程在运行时通过连接点保持激发事件。

提供两个客户端:Drive 和 MDrive。可以在 Drive 和 MDrive 子目录中找到它们。

  • Drive.exe 是一个简单的控制台应用程序,提供了实现 IRandomEvent 接口的单个对象。它创建一个 CoRandom 对象,在连接点上调用 Advise 和 Unadvise,并使 CoRandom 对象将事件引发到驱动器的对象中。

  • Mdrive.exe 是基于 MFC 对话框的应用程序,能够创建多个通知接收器并控制服务器所创建的线程的数目。在运行 Mdrive.exe 时,至少单击一次“Start”按钮,然后单击几次 Advise 按钮。每单击 Advise 按钮一次,就会添加一个连接点,这使显示范围更广。如果不单击 Advise 按钮,则在显示中不会看到任何活动。

属性

此示例使用下面的属性:

  • Connect   coclass、default、dll、dual、event_source、helpstring、id、in、module、name、object、out、pointer_default、progid、support_error_info、uuid、vi_progid

  • Connect/drive   event_receiver、module

关键字

此示例使用以下关键字:

AfxGetApp、AfxMessageBox、AtlAdvise、ATLASSERT、AtlUnadvise、BEGIN_COM_MAP、BEGIN_CONNECTION_POINT_MAP、BEGIN_MESSAGE_MAP、BEGIN_OBJECT_MAP、CComCoClass、CComModule::GetClassObject、CComModule::GetLockCount、CComModule::Init、CComModule::RegisterServer、CComModule::Term、CComModule::UnregisterServer、CComObject::CreateInstance、CComObjectRoot、CDialog::OnCancel、CDialog::OnOK、CloseHandle、CoCreateInstance、COleTemplateServer::RegisterAll、COM_INTERFACE_ENTRY、COM_INTERFACE_ENTRY_IMPL、COM_INTERFACE_ENTRY2、CONNECTION_POINT_ENTRY、CoUninitialize、CreateEvent、CreateThread、DECLARE_REGISTRY_RESOURCEID、DisableThreadLibraryCalls、DoModal、DrawIcon、END_COM_MAP、END_CONNECTION_POINT_MAP、END_MESSAGE_MAP、END_OBJECT_MAP、GdiFlush、GetClientRect、GetDlgItem、GetTickCount、GetUnknown、IConnectionPointContainerImpl、IConnectionPointImpl、IDispatchImpl、ISupportErrorInfo、LoadIcon、Lock、memset、OBJECT_ENTRY、ON_COMMAND、puts、ReleaseDC、SendMessage、SetEvent、SetIcon、SetPixel、Sleep、Unadvise、Unlock、WaitForSingleObject

说明:

其中某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。

请参见

其他资源

ATL 属性示例