ATLDuck 属性示例:将连接点用于 ATL

更新:2007 年 11 月

ATLDuck 属性示例由两个项目组成:atlduck 和 duck。duck 项目创建实现 IDuckInt 接口的对象的实例。此接口包括四个成员函数:Flap、Paddle、Quack 和 Walk。

第二个项目 atlduck 有一个 IDuckInt 接口的连接点(即它知道如何使用该接口但并不实现该接口)。将只创建该对象的一个实例。当两个应用程序之间建立连接后,atlduck 将为已调用 IConnectionPoint::Advise 的接收器调用 IDuckInt 接口中的函数。

在 ATLDuck 中说明各种 IDL 属性、COM 属性和编译器属性,包括可聚集的 event_source 和 event_receiver。通过指定 aggregratable("never") 属性使 DuckInt 类成为不可聚集的类。在无 layout dependent=true(布局依赖 = 真)设置的情况下,将 DuckDoer 类设置为 com event_source,而将 DuckInt 类设置为 com event_receiver。

ATLDuck 示例为此示例的非属性化版本。

安全说明:

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

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

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

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

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

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

生成并运行示例

生成此示例

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

  2. 在“生成”菜单中,单击“生成解决方案”。这将同时生成两个项目并执行必要的注册。将创建以下文件:

    • atlduck.exe,EXE 服务器

    • duck.exe,EXE 客户端

运行此示例

  1. 在“调试”菜单中,单击“开始执行(不调试)”。这将启动 atlduck 服务器和 duck 客户端的一个实例。若要运行多个客户端,请定位到 duck.exe 所在的目录并从命令提示处手动运行它。

  2. 出现一个对话框。在该对话框中,单击“Create DoDuck Object”按钮。单击此按钮后,应用程序将通过运行 atlduck 来创建具有类 ID CLSID_DuckDoer 的对象的实例。

  3. 出现一个由 atlduck.exe 发出的新的对话框。此对话框不但为 IDuckInt 接口中的每个函数显示一个按钮,而且还显示一个具有到活动接收器及其 Cookie 的连接的列表框。从 duck 对话框中,可以 AdviseUnadvise 连接点。根据您的选择,您将收到或者不会收到来自源的通知。接收到通知后,该通知将显示在状态编辑字段中。另外,ATLDuck 还说明了当通知连接时由连接点提供的 Cookie 的值。

属性

此示例使用下面的属性:

  • ATLDuck   aggregatable、coclass、dispinterface、event_source、exe、helpstring、id、module、name、progid、uuid、vi_progid

  • ATLDuck/Duck   aggregatable、coclass、default、dispinterface、event_receiver、exe、helpstring、id、iid_is、in、module、name、object、out、progid、unique、uuid、version、vi_progid

类和关键字

此示例使用下面的类:

CDialog (MFC)、CComObject (ATL)、IConnectionPointImpl<CDuckDoer> (ATL)

此示例使用以下关键字:

_ASSERTE;_tcslen;_VERIFY;AddRef;Advise;BEGIN_COM_MAP;BEGIN_CONNECTION_POINT_MAP;BEGIN_MSG_MAP;BEGIN_OBJECT_MAP;CComCoClass;CComModule::Unlock;CComObjectRootEx;CDialogImpl;CenterWindow;CoInitialize;COM_INTERFACE_ENTRY;COM_INTERFACE_ENTRY_IMPL;COMMAND_HANDLER;COMMAND_ID_HANDLER;CONNECTION_POINT_ENTRY;CoSuspendClassObjects;CoUninitialize;Create;DECLARE_CLASSFACTORY_SINGLETON;DECLARE_NOT_AGGREGATABLE;DECLARE_REGISTRY_RESOURCEID;DestroyWindow;DispatchMessage;EnableWindow;END_COM_MAP;END_CONNECTION_POINT_MAP;END_MSG_MAP;END_OBJECT_MAP;ExitProcess;FindConnectionPoint;GetCommandLine;GetDC;GetDlgItem;GetMessage;GetTextExtentPoint32;IConnectionPointContainerImpl;IConnectionPointImpl;Init;IsWindowVisible;MESSAGE_HANDLER;MessageBox;OBJECT_ENTRY;OleInitializeCoCreateInstance;OnCancel;OnFlap;OnInitDialog;OnOK;OnPaddle;OnWalk OnQuack;PostThreadMessage;QueryInterface;RecalcListboxExtent;RegisterClassObjects;RegisterServer;reinterpret_cast;ReleaseDC;RevokeClassObjects;SendMessage;SetOwner;SetWindowText;ShowStatus;ShowWindow;Unadvise;UnregisterServer;UNUSED_ALWAYS;UpdateRegistryFromResource;UpdateWindow;USES_CONVERSION

说明:

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

请参见

其他资源

ATL 属性示例