如何在Visual Studio 2008中创建一个COM DLL?

10

我已经很久没有编写COM dll了。现在我创建了几个继承自一些COM接口的类,但我想测试一下。我知道我需要在某个地方放置一个GUID,然后使用regsvr32进行注册,但具体步骤是什么呢?

编辑:抱歉,我忘记提到我正在使用C++。

3个回答

12
要创建一个新的ATL COM项目,请按照以下步骤进行:
  1. 文件/新建项目
  2. Visual C++/ATL/ATL项目
  3. 自定义设置,完成后按“完成”
您已经创建了一个新的dll文件,但它是空的。要添加COM对象,请按照以下步骤进行:
  1. 项目/添加类
  2. Visual C++/ATL/ATL简单对象,按“添加”
  3. 输入您想要的名称(如MyObject),并按“完成”以添加它
如果您想让一个对象实现一个接口
  1. 在类视图中选择对象类(CMyObject)
  2. 右键单击/添加/实现接口...
  3. 可以选择将要实现哪个接口
    1. 从已经在项目文件中的.idl文件中
    2. 从嵌入有类型库的.tlb/.dll/.exe文件中
    3. 从已经注册的对象中
  4. 完成后按“完成”
PS:创建具有相同名称的新ATL项目,并在其中添加自定义文件要容易得多。向导执行了几个任务并创建了几个定制文件。
对于难以逐个添加文件的较大项目,我会执行相同的操作,但不是将我的文件添加到新项目中,而是开始将设置从新项目复制到旧项目中,并添加向导创建的任何其他文件,修复头文件(如stdafx.h)以合并新设置。
PPS:如果您想让您的dll支持MFC,则必须选择MFC/MFC Dll而不是ATL项目。当您添加ATL Simple Object时,向导将要求为该项目添加ATL支持。

4
你需要编写一个名为 DllGetClassObject 的函数并导出它。该函数负责分配“类工厂”(您还需要编写),后者又可以分配您的 COM 对象的实例。它必须实现IClassFactory

这并不太难。另外一种选择是使用 ATL(请参见 xhantt 的答案),理论上它会替你完成这项任务,但在实践中却是一团糟。它设法将 COM 的复杂性封装在更加复杂的抽象层中。尝试在 DLL 之间移动对象吧,祝你好运。

但是,你可以运行 ATL 向导以查看如何声明 DllGetClassObject 的示例。实现 IClassFactory 非常容易——只需新建一个对象的方法。

接下来,你需要注册你的DLL-即将键插入注册表中。 regsvr32 工具不能在没有您的进一步帮助时完成此操作。你必须编写并导出另一个名为 DllRegisterServer 的功能,它完成所有重要的工作。 regsvr32 所做的就是加载 DLL、查找DllRegisterServer 并调用它。

同样,ATL有一种为你实现这个功能的方法,但它通过读取一个包含注册表修改说明的脚本(存储在嵌入到您的 DLL 资源中的 .rgs 文件中)来完成这项工作。如果您在此文件中意外地放置了任何语法错误,那么注册将会悄无声息地失败。

所以,你可能会发现自己编写几行代码来自己调整注册表更简单。详情请参见这里

如果你使用 C# 就不会有这些问题。一切都被清晰地封装起来。实际上,C# 作为开发 COM 对象的工具比 C++ 表现得更好。


还是IClassFactory2? - S Meaden

1

当您构建解决方案时,它会自动注册dll。同时还会创建两个文件_i.c和.h文件。

为了测试dll,请创建示例应用程序:

  1. 创建示例Win32应用程序。在具有主函数的win32应用程序的cpp文件中包含_i.c和.h

  2. 调用CoInitialize();

  3. 声明接口指针 CComPtr pMyInterface = NULL; //其中IMyInterface在_i.c中声明

  4. 创建实例 pMyInterface.CoCreateInstance(CLSID_MyClass); // CLSID_MyClass是表示CoClass的GUID

  5. 调用接口中存在的API

  6. 调用CoUnInitialize();


我建立了一个标准的Win32项目,没有包含ATL/MFC。我需要知道如何设置项目设置,以便将其正确构建为COM dll。 - Mark Ingram
您可以参考以下链接:http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=88625 - Vinay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接