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

时间:2009-01-21 13:43:03

标签: c++ visual-studio-2008 com dll guid

自从我写了一个COM dll以来已经很久了。我现在已经创建了几个类,它继承了一些COM接口,但我想测试一下。我知道我必须在某处放置一个GUID然后用regsvr32注册它,但涉及的步骤是什么?

编辑:对不起,忘了提我正在使用C ++。

3 个答案:

答案 0 :(得分:11)

要创建新的ATL COM项目,您可以按以下步骤操作:

  1. 文件/新项目
  2. Visual C ++ / ATL / ATL项目
  3. 自定义设置,完成后按完成
  4. 您已经创建了一个新的dll,但它是空的,要添加一个COM对象,您可以这样做:

    1. 项目/添加课程
    2. Visual C ++ / ATL / ATL简单对象,按添加
    3. 提供您想要的名称(如MyObject),然后按“完成”添加
    4. 如果您希望对象实现接口

      1. 在类视图中选择对象类(CMyObject)
      2. 右键单击/添加/实施界面...
      3. 您可以选择要实施的接口
        1. 来自项目文件中已有的.idl文件
        2. 来自嵌入了类型库的.tlb / .dll / .exe
        3. 来自已注册的对象
      4. 完成后按完成
      5. PS:在不同的文件夹中创建具有相同名称的新ATL项目要容易得多,并添加您自定义的文件。该向导执行多项任务并创建多个自定义文件。

        对于难以逐个文件添加的大型项目,我也是这样做的,但是我没有将我的文件添加到新项目中,而是开始将设置从新项目复制到旧项目,并添加任何其他文件向导已创建并修复stdafx.h之类的标题以合并新设置。

        PPS:如果你想让你的dll支持MFC,你必须选择MFC / MFC Dll而不是选择ATL Project。当您添加ATL简单对象时,向导将要求为项目添加ATL支持。

答案 1 :(得分:3)

您需要编写一个名为DllGetClassObject的函数并将其导出。该函数负责分配一个“类工厂”,您还必须编写该类工厂,而这又能够分配COM对象的实例。它必须实现IClassFactory

做起来并不难。替代方案是使用ATL(参见xhantt的答案),理论上这对你来说是这样,但在实践中它是一个真正的混乱。不知何故,它设法将COM的复杂性封装在一个更复杂的抽象层中。祝你好像试图在DLL之间移动一个对象。

但是你可以运行ATL向导只是为了看一个如何声明DllGetClassObject的例子。实现IClassFactory非常简单 - 只是一种新闻对象的方法。

然后您需要注册您的DLL - 即将密钥放入注册表。没有您的进一步帮助,regsvr32工具无法执行此操作。你必须编写和导出另一个名为DllRegisterServer的函数,它可以完成所有的工作。 regsvr32所做的只是加载DLL,查找DllRegisterServer并调用它。

同样,ATL有一种为您实现此功能的方法,但它通过读取一种充满注册表修改指令的脚本来实现,该脚本存储在嵌入DLL资源的.rgs文件中。如果您不小心将任何语法错误放入此文件中,则注册将无提示失败。

所以再一次,您可能会发现编写几行代码来自行调整注册表会更简单。 Here are the details

如果您使用C#,则不会出现任何这些问题。一切都封装得非常干净。它实际上比C ++作为开发COM对象的工具要好得多。

答案 2 :(得分:1)

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

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

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

  2. 致电CoInitialize();

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

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

  5. 调用界面中的API

  6. 调用CoUnInitialize();