Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在VisualStudio2008中创建COM DLL?_C++_Visual Studio 2008_Com_Dll_Guid - Fatal编程技术网

C++ 如何在VisualStudio2008中创建COM DLL?

C++ 如何在VisualStudio2008中创建COM DLL?,c++,visual-studio-2008,com,dll,guid,C++,Visual Studio 2008,Com,Dll,Guid,我很久没有写过COM dll了。我现在已经创建了几个类,它们继承了一些COM接口,但我想测试一下。我知道我必须在某个地方放置一个GUID,然后将其注册到regsvr32,但是需要执行哪些步骤 编辑:对不起,忘了提到我用C++。< p>当你构建解决方案时,它自动注册DLL。 它还创建了两个文件_i.c和.h文件 要测试dll,请创建示例应用程序: 创建示例Win32应用程序。在具有main函数的win32应用程序的cpp文件中包含_i.c和.h 调用CoInitialize() 声明接口指针 CC

我很久没有写过COM dll了。我现在已经创建了几个类,它们继承了一些COM接口,但我想测试一下。我知道我必须在某个地方放置一个GUID,然后将其注册到regsvr32,但是需要执行哪些步骤


<>编辑:对不起,忘了提到我用C++。

< p>当你构建解决方案时,它自动注册DLL。 它还创建了两个文件_i.c和.h文件

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

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

  • 调用CoInitialize()

  • 声明接口指针 CComPtr pMyInterface=NULL;//其中IMI接口在i.c中声明

  • 创建实例 pMyInterface.CoCreateInstance(CLSID_MyClass);//CLSID_MyClass是表示
    辅类

  • 调用接口中存在的API

  • 调用coninitialize()


  • 要创建新的ATL COM项目,您可以按以下步骤进行:

  • 文件/新项目
  • Visual C++/ATL/ATL项目
  • 自定义it设置,完成后按finish
  • 您已经创建了一个新的dll,但它是空的。要添加COM对象,可以执行以下操作:

  • 项目/添加类
  • Visual C++/ATL/ATL简单对象,按add
  • 指定所需的名称(如MyObject),然后按finish添加该名称
  • 如果希望对象实现接口

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

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


    PPS:如果您希望您的dll支持MFC,那么您必须选择MFC/MFCDLL,而不是选择ATL项目。添加ATL简单对象时,向导将要求向项目添加ATL支持。

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

    这不难做到。另一种选择是使用ATL(参见xhantt的答案),理论上它可以为您实现这一点,但实际上它真的是一团糟。不知何故,它设法将COM的复杂性封装在一个更复杂的抽象层中。例如,尝试在DLL之间移动对象会带来好运

    但是您可以运行ATL向导来查看如何声明
    DllGetClassObject
    的示例。实现
    IClassFactory
    非常简单——这只是一种向对象发送消息的方法

    然后你需要注册你的动态链接库,也就是说,把键放入注册表。没有您的进一步帮助,
    regsvr32
    工具无法执行此操作。您必须编写并导出另一个名为的函数,它完成所有的艰苦工作。
    regsvr32
    所做的就是加载DLL,查找
    DllRegisterServer
    并调用它

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

    同样,您可能会发现自己编写几行代码来调整注册表更简单


    如果改用C#,就不会有这些问题。一切都封装得很干净。它实际上比C++开发COM对象的工具要好得多。

    我建立了一个BOG标准Win32项目,没有包含ATL/MFC。我需要知道如何设置项目设置以使其正确构建为COM dll。您可以参考以下链接或IClassFactory2?