我已经很久没有编写COM dll了。现在我创建了几个继承自一些COM接口的类,但我想测试一下。我知道我需要在某个地方放置一个GUID,然后使用regsvr32进行注册,但具体步骤是什么呢?
编辑:抱歉,我忘记提到我正在使用C++。
我已经很久没有编写COM dll了。现在我创建了几个继承自一些COM接口的类,但我想测试一下。我知道我需要在某个地方放置一个GUID,然后使用regsvr32进行注册,但具体步骤是什么呢?
编辑:抱歉,我忘记提到我正在使用C++。
这并不太难。另外一种选择是使用 ATL(请参见 xhantt 的答案),理论上它会替你完成这项任务,但在实践中却是一团糟。它设法将 COM 的复杂性封装在更加复杂的抽象层中。尝试在 DLL 之间移动对象吧,祝你好运。
但是,你可以运行 ATL 向导以查看如何声明 DllGetClassObject
的示例。实现 IClassFactory
非常容易——只需新建一个对象的方法。
接下来,你需要注册你的DLL-即将键插入注册表中。 regsvr32
工具不能在没有您的进一步帮助时完成此操作。你必须编写并导出另一个名为 DllRegisterServer 的功能,它完成所有重要的工作。 regsvr32
所做的就是加载 DLL、查找DllRegisterServer
并调用它。
同样,ATL有一种为你实现这个功能的方法,但它通过读取一个包含注册表修改说明的脚本(存储在嵌入到您的 DLL 资源中的 .rgs 文件中)来完成这项工作。如果您在此文件中意外地放置了任何语法错误,那么注册将会悄无声息地失败。
所以,你可能会发现自己编写几行代码来自己调整注册表更简单。详情请参见这里。
如果你使用 C# 就不会有这些问题。一切都被清晰地封装起来。实际上,C# 作为开发 COM 对象的工具比 C++ 表现得更好。
当您构建解决方案时,它会自动注册dll。同时还会创建两个文件_i.c和.h文件。
为了测试dll,请创建示例应用程序:
创建示例Win32应用程序。在具有主函数的win32应用程序的cpp文件中包含_i.c和.h
调用CoInitialize();
声明接口指针 CComPtr pMyInterface = NULL; //其中IMyInterface在_i.c中声明
创建实例 pMyInterface.CoCreateInstance(CLSID_MyClass); // CLSID_MyClass是表示CoClass的GUID
调用接口中存在的API
调用CoUnInitialize();