【问题标题】:How do you create a COM DLL in Visual Studio 2008?如何在 Visual Studio 2008 中创建 COM DLL?
【发布时间】:2009-01-21 13:43:03
【问题描述】:

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

编辑:抱歉,忘了说我使用的是 C++。

【问题讨论】:

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


    【解决方案1】:

    要创建一个新的 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 Project。当您添加 ATL 简单对象时,向导将要求将 ATL 支持添加到项目中。

    【讨论】:

      【解决方案2】:

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

      这并不难。另一种方法是使用 ATL(请参阅 xhantt 的回答),理论上它会为您做到这一点,但实际上它是一团糟。不知何故,它设法将 COM 的复杂性封装在一个更加复杂的抽象层中。祝你好运,例如在 DLL 之间移动对象。

      但是您可以运行 ATL 向导来查看如何声明 DllGetClassObject 的示例。实现IClassFactory 非常简单 - 只需一种方法即可更新对象。

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

      同样,ATL 有一种方法可以为您实现这一点,但它是通过读取一种充满注册表修改指令的脚本来实现的,该脚本存储在嵌入到您的 DLL 资源中的 .rgs 文件中。如果您不小心将任何类型的语法错误放入此文件中,注册会静默失败。

      同样,您实际上可能会发现自己编写几行代码来调整注册表更简单。 Here are the details.

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

      【讨论】:

      • 还是 IClassFactory2?
      【解决方案3】:

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

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

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

      2. 调用 CoInitialize();

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

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

      5. 调用接口中的 API

      6. 调用 CoUnInitialize();

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多