Welcome

首页 / 软件开发 / .NET编程技术 / CLR完全介绍 - COM Interop简介

CLR完全介绍 - COM Interop简介2011-10-19 msdn Thottam R. SriramCOM 是一种很出色的技术。正是由于公共语言运行库 (CLR) 能够使 Microsoft® .NET 应用程序 和非托管 COM 组件之间进行无缝交互,才使得 CLR 成为极其强大的平台。但是我在网络上进行搜索时, 几乎找不到能够说明 COM Interop 的最基本概念的有用示例。本专栏的目的是讲解这些基本概念,并提 供切实有用的示例,帮助这一技术领域的用户快速入门。

我将以一个简单的活动模板库 (ATL) COM 服务器开始介绍,使用一个非托管 COM 客户端对该服务器 尝试不同的访问方法,然后使用托管客户端进行相同的操作。我将逐一介绍各个 DLL,说明从非托管到托 管的转换,并且还将说明如何使用 P/Invoke 在非托管 DLL 中访问导出的方法。本文中最难的部分是理 解复杂结构的封送,在本专栏中将不对这一点进行详尽的介绍。仅介绍这一知识点就需要开辟一个完整的 专栏或写一本书。我将为您展示非托管代码如何使用接口来回调托管代码。(您也可以使用委托达到这一 目的,但本专栏不介绍这种方法。)

最后,我将介绍使用公共符号对您的 COM Interop 项目进行 调试。这部分将对 WinDbg.exe、非托管调试和使用 SOS 进行的托管调试进行最基本的介绍。我将演示在 托管代码中调用非托管代码或在非托管代码中调用托管代码时堆栈的情况。

一个简单的 ATL COM 服务器

我们首先来编写一个简单的 COM 服务器。客户端将承载运行中的服务器,并在服务器中执 行方法。

为了使开发变得简单,我将使用 ATL COM。创建名为 COMInteropSample 的目录,然后 创建一个新的 Visual C++® ATL 项目并为它命名(假设为 MSDNCOMServer)。取消选择“创建 新目录”选项,其他项采用默认值。

现在向解决方案中添加一个新的类/接口。如果您还没 有看到它,请打开解决方案资源管理器。右键单击 MSDNCOMServer,然后选择“添加 ”|“类”。选择“ATL”和“ATL 简单对象”,然后单击“ 添加”。输入类的简称(假设为 MyCOMServer),然后其他项采用默认值。单击“完成 ”以添加该类。

向为您创建好的接口添加一个新方法。转到“类”视图,右键单 击 IMyCOMServer 接口,然后选择“添加”|“添加方法”。为该方法命名(假设 为 MyCOMServerMethod),然后单击“完成”。

现在,我们要在类中实现该方法。选 择 MyCOMServer.cpp 并查看源代码。您将在 cpp 文件的接口中看到向导添加的方法。在 TODO 部分中, 添加以下代码:

wprintf_s(L"Inside MyCOMServerMethod");
编译代码以 生成服务器 DLL。

现在,我们已完成了 ATL COM 服务器。它将在类 CMyCOMServer 中实现 IMyCOMServer 接口,并向默认输出流中写入一条消息。接口的 GUID 在 IDL 文件中定义为接口定义的一 个属性,如图 1 所示。

Figure 1 IMyCOMServer 定义

[  object,  uuid(45FA03A3-FD24-41EB-921C-15204CAF68AE),  nonextensible,  helpstring("IMyCOMServer Interface"),  pointer_default(unique)]interface IMyCOMServer : IUnknown {  [helpstring("method MyCOMServerMethod")]  HRESULT(MyCOMServerMethod)( void);};[  uuid(3BA5DF7B-F8EF-4EDE-A7B5-5E7D13764ACC),  version(1.0),  helpstring("MSDNCOMServer 1.0 Type Library")]library MSDNCOMServerLib{  importlib("stdole2.tlb");  [    uuid(2D6D2821-A7FB-4F99-A61A-2286A47CD4D1),    helpstring("MyCOMServer Class")  ]  coclass MyCOMServer  {    [default] interface IMyCOMServer;  };};