ACDUAL 示例:向自动化应用程序添加双重接口

更新:2007 年 11 月

ACDual 说明如何向基于 MFC 的自动化(原来为 OLE 自动化)应用程序添加双重接口支持。该解决方案由以下项目组成:

  • ACDualDriv,包含自动化客户端 AUTODRIV 项目的某个版本,该版本使您可以选择是使用调度接口还是使用 vtable 绑定来控制服务器应用程序。

  • ACDual,包含具有双重接口支持的自动化服务器 AUTOCLIK 项目的实际版本。

安全说明:

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

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

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

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

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

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

生成示例

生成 ACDual 示例

  1. 打开位于 acdual 目录中的解决方案 acdual.sln。

  2. 在“生成”菜单中单击“生成”。

  3. 将 ACDual 作为独立的应用程序运行一次,以便它可以向系统注册自身。

运行示例

在注册 ACDual 应用程序后,就可以准备好运行 ACDualDriv 应用程序了。从 IDE 生成解决方案将在运行 ACDualDriv 前自动执行 ACDualDriv 注册。ACDualDriv 启动 ACDual 应用程序并创建 Document 对象,然后就可以通过 ACDualDriv 用户界面控制对“自动化”的使用。它还包含一个附加的复选框,使您可以选择是否使用 VTBL 绑定来与 ACDual Document 对象进行通信。

ACDual 服务器使用 AUTOCLIK 作为起始点。已生成新的全局唯一标识符 (GUID) 来避免和原来的 AUTOCLIK 示例混淆,并且已更改了一些资源字符串来阐明 ACDual 服务器是否正在运行。对源的所有其他更改都用类似以下的注释块标明:

      // DUAL_SUPPORT_START
      ... modified code goes here
      // DUAL_SUPPORT_END

有关双重接口、对象描述语言 (ODL) 脚本和自动化错误接口的更多信息,请参见技术说明 65

双重接口

双重接口使您可以实现 IDispatch 接口或 VTBL 接口。强烈建议双重接口用于所有公开的 Automation 对象。在实现双重接口时需考虑的问题将在技术说明 65 中讨论并且包括:

  • 实现对基于 CCmdTarget 的类的双重接口支持

  • 传递双重接口指针

  • 启用类型安全绑定,包括:

    • 注册应用程序的库类型

    • 修改项目生成设置以容纳类型库更改

    • 在类型库中指定正确的对象类名称

  • 处理异常和自动化错误接口

有关更多信息,请参见 ActiveX 主题Overview of Automation双重接口Overview of Type Description Interfaces和对 dual 属性的 ODL 引用项。

说明:

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

关键字

ACDual 示例说明以下关键字:

AfxMessageBox;AfxOleInit;AfxOleLockApp;AfxOleUnlockApp;CCmdTarget::EnableAutomation;CCmdTarget::FromIDispatch;CCmdTarget::GetIDispatch;CCmdTarget::OnFinalRelease;CControlBar::EnableDocking;CControlBar::GetBarStyle;CControlBar::SetBarStyle;CDialog::DoModal;CDocument::GetFirstViewPosition;CDocument::GetNextView;CDocument::OnNewDocument;CDocument::SetModifiedFlag;CDocument::UpdateAllViews;CFrameWnd::ActivateFrame;CFrameWnd::DockControlBar;CFrameWnd::EnableDocking;CFrameWnd::LoadFrame;CObject::AssertValid;CObject::Dump;CObject::IsKindOf;CObject::Serialize;COleTemplateServer::ConnectTemplate;COleTemplateServer::UpdateRegistry;CStatusBar::Create;CStatusBar::SetIndicators;CToolBar::Create;CView::DoPreparePrinting;CView::GetDocument;CView::OnBeginPrinting;CView::OnDraw;CView::OnEndPrinting;CView::OnPreparePrinting;CWinApp::AddDocTemplate;CWinApp::EnableShellOpen;CWinApp::InitInstance;CWinApp::LoadStdProfileSettings;CWinApp::RegisterShellFileTypes;CWnd::DoDataExchange;CWnd::GetParentFrame;CWnd::OnCreate;CWnd::OnLButtonDown;CWnd::PreCreateWindow;CWnd::ShowWindow;CWnd::UpdateWindow;DragAcceptFiles;ShowWindow;TextOut

ACDualDriv 说明以下关键字:

AfxGetApp;AfxMessageBox;AfxOleInit;CDC::DrawIcon;CDC::GetSafeHdc;CDialog::DoModal;CDialog::EndDialog;COleDispatchDriver::AttachDispatch;COleDispatchDriver::GetProperty;COleDispatchDriver::InvokeHelper;COleDispatchDriver::SetProperty;CRect::Height;CRect::Width;CWinApp::InitInstance;CWinApp::LoadStdProfileSettings;CWnd::DoDataExchange;CWnd::GetClientRect;CWnd::IsIconic;CWnd::OnClose;CWnd::OnCreate;CWnd::OnPaint;CWnd::OnQueryDragIcon;CWnd::SendMessage;CWnd::ShowWindow;CWnd::UpdateData;GetSystemMetrics;LoadIcon;ShowWindow

请参见

其他资源

MFC 示例