MFCATL 示例:在 MFC 服务器中使用 ATL COM 对象
更新:2007 年 11 月
MFCATL 示例阐释如何在 MFC 服务器 EXE 中使用 ATL COM 对象。
该服务器允许创建两个对象:ObjectOne(在 MFC 中实现并支持 dispinterface)和 ObjectTwo(在 ATL 中实现并支持双重接口)。
安全说明: |
---|
提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。 |
获取示例和安装示例的说明:
在 Visual Studio 的“帮助”菜单上,单击“示例”。
有关更多信息,请参见定位示例文件。
示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。
还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。
生成并运行示例
生成并运行此示例
打开解决方案文件 mfcatl.sln。
在“生成”菜单中,单击“生成解决方案”。
在“调试”菜单中,单击“开始执行(不调试)”。这将单独运行 mfcatl.exe 服务器并注册它。
在 Web 浏览器中打开 mfcatl.htm 文件并单击按钮以调入合适的对象。可以单独调用每个对象或同时调用这两个对象。
转换备注
两个 MFCATL 对象最初均在 MFC 中实现。它们都是从 CCmdTarget 中派生的。使用 ATL 通过以下步骤再次实现了 ObjectTwo:
请在 Premfcat.h 中包含 ATL 头文件(Atlbase.h 和 Atlcom.h)。
在 Premfcat.cpp 中包含 Atlimpl.cpp。
向 Prefcat.h 添加 CComModule 派生类(类似 BEEPER EXE 示例)。派生类通过调用 AfxOleLockApp 和 AfxOleUnlockAppe 实现 Lock 和 Unlock 方法,以将锁计数转发到 MFC。
在 Mfcatl.cpp 中添加对象映射宏对 (BEGIN_OBJECT_MAP/END_OBJECT_MAP) 并添加名为 _Module 的模块类的静态实例。
从 InitInstance 和 ExitInstance 调用 _Module.Init 和 Term。
添加类型库作为资源。
从 InitInstance 调用 _Module.RegisterServer(TRUE) 以匹配 MFC 对 COleObjectFactory::UpdateRegistryAll 的调用。
调用 _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE) 来匹配 MFC 类工厂的 REGCLS_MULTIPLEUSE,这与 IMPLEMENT_OLECREATE 宏隐式执行的操作相同。
在 ATL 中通过以下步骤再次实现 ObjectTwo:
将 ODL 文件由 dispinterface 更改为双重接口。
使 ODL 编译生成 ATL 所需要的头文件 (Interf.h)。
重写 .h 文件和 .cpp 文件(最快的方法是运行 ATL 向导并复制、粘贴和重命名自动生成的代码以取代原始 MFC 代码)。
向 ATL 对象映射添加 OBJECT_ENTRY(CLSID_ObjectTwo, CObjectTwo)。
此处未涉及的其他转换步骤可能包括:
将 ODL 文件转换为 IDL 格式。
添加对 -RegServer 和 -UnregServer 命令行参数的支持。
关键字
此示例使用以下关键字:
AfxMessageBox; AfxOleInit; AfxOleLockApp; AfxOleUnlockApp; ASSERT; BEGIN_COM_MAP; CCmdTarget; CCmdTarget::OnFinalRelease; CComCoClass; CComModule; CComModule::GetLockCount; CComModule::Lock; CComModule::Unlock; CComObjectRoot; CDialog; CMenu::AppendMenu; COleObjectFactory::RegisterAll; COleObjectFactory::UpdateRegistryAll; COM_INTERFACE_ENTRY; CString::IsEmpty; CString::LoadString; CWindow::GetSystemMenu; DECLARE_DYNCREATE; DECLARE_NOT_AGGREGATABLE; DECLARE_REGISTRY; DestroyWindow; EnableAutomation; GetClientRect; GetSystemMetrics; IDispatchImpl; PostMessage; SendMessage; SetIcon; ShowWindow; SysAllocString