INPROC 示例:演示进程内自动化服务器应用程序
更新:2007 年 11 月
INPROC 示例是进程内自动化(原来为 OLE 自动化)服务器。与其他 MFC 自动化服务器示例不同,INPROC 可在客户端的地址空间中被加载为动态链接库 (DLL)。进程内服务器通常比作为单独的 EXE 实现的服务器更有效,因为不再需要远程过程调用 (RPC) 来调用服务器实现的对象上的方法了。
说明: |
---|
某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。 |
安全说明: |
---|
提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。 |
获取示例和安装示例的说明:
在 Visual Studio 的“帮助”菜单上,单击“示例”。
有关更多信息,请参见定位示例文件。
示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。
还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。
生成并运行示例
生成并运行 INPROC 示例
打开应用程序 inproc.sln。
在“生成”菜单中单击“生成”。
使用项目的 .reg 文件注册 INPROC 的 DLL,也就是说,或者运行 regedit INPROC.REG,或者使用 REGSVR 示例中的 REGSVR。
如果使用 REGEDIT,则确保 Inproc.dll 位于系统路径上。您还可以修改 .reg 文件以显式表示 Inproc.dll 的路径。
DLL 不能像 EXE 那样独立运行;因此,若要测试 INPROC,您必须从客户端应用程序“驱动”它。INPROC 可以从 Visual Basic 或 Visual C++ 驱动。请参见 IPDRIVE 示例以了解从 Visual C++ 驱动 INPROC 的示例。
说明: 可以生成 INPROC 的 EXE 版本或 DLL 版本。在示例的项目设置中设置 EXE 变量。INPROC 的 EXE 版本只在 Windows 注册表中注册其自身。
INPROC 类
CVariantMap 类实现 VARIANT 到 VARIANT 映射。这允许将任何 VARIANT 映射到任何其他的 VARIANT。尽管这可能对 Visual C++ 程序员而言是没有多大用处的(这些程序员可能直接使用 CMap),但它确实将 MFC 的集合类的强大功能带给 Visual Basic 用户。CVariantMap 类通过名称 mfc.inproc.varmap 访问。这就是在 Windows 注册表中注册该对象的方式。CVariantMap 实现标准集合方法和属性以及 _NewEnum 方法。
CStringCollect 类实现字符串数组。其实现比 CVariantMap 类简单,尽管它实现许多与 CVariantMap 相同的自动化功能。CStringCollect 对象通过名称 mfc.inproc.strcoll 访问。它实现大多数标准集合方法和属性,因而对于如何实现您自己的集合是一个好的示例。值得特别注意的是其 _NewEnum 方法的实现,该方法允许 Visual Basic 用户在枚举集合的内容时使用 For Each... In 语法。CStringCollect 使用 CEnumVariant 来实现此功能(它使用 MFC 的接口映射来实现 IEnumVARIANT)。您可能会发现 CEnumVariant 在您自己的应用程序中将很有用。
最后,该示例实现几个哑元属性,这些属性只用于比较进程内服务器和 LocalServer 服务器的性能。它们是由 IPDRIVE 的 Test1 和 Test2 按钮测试的属性。
关键字
此示例说明以下关键字:
AfxIsValidAddress;AfxMessageBox;AfxOleInit;AfxOleLockApp;AfxOleUnlockApp;AfxThrowMemoryException;AfxThrowOleException;CCmdTarget::EnableAutomation;CCmdTarget::GetIDispatch;CCmdTarget::OnFinalRelease;CString::AllocSysString;CWinApp::InitInstance;CWinApp::RunAutomated;CWinApp::RunEmbedded;DllCanUnloadNow;DllGetClassObject;min