注册COM接口的实现

3
我对COM编程很陌生。我已经准备好了一个COM对象(以及相关的IClassFactory),但我不太清楚如何注册结果DLL以供其他程序使用。我需要使用的GUID数量也不清楚。
我要注册的COM对象实现了IAudioSessionEvents接口。
我已经找到了DllRegisterServer和DllUnregisterServer函数,但我没有找到它们使用的明确示例。它们处理哪些键,如何调用它们,由什么和何时调用等等?
谢谢, -Kevin Montrose
3个回答

4

每个要向COM公开的类都需要一个GUID,每个引入并希望通过COM提供的新接口也需要一个GUID。

当您使用regsvr32实用程序(随Windows一起提供)注册您的COM公开类时,将调用DllRegisterServer / DllUnregister server。它为您向COM公开的每个类添加/删除HKCR / CLSID分支的键。这些键由CoCreateInstance()用于查找要加载以创建具有给定GUID的类实例的DLL。

如果您使用ATL或类似工具,则通常无需完全实现DllRegisterServer / DllUnRegisterServer,而是使用库提供的实现。


4
我不确定您是在实现还是使用支持IAudioSessionEvents的DLL。如果您正在使用此DLL,则可以使用注释行实用程序regsvr32注册组件。要注册,请使用:
regsvr32
要取消注册,请使用:
regsvr32 /u
regsvr32应该在您的路径上,因此此命令将从任何目录中运行。
如果您正在实现相关的DLL,则必须提供DllRegisterServer和DllUnRegisterServer函数的实现。这些函数必须为您的组件设置和清理注册表条目。注册表条目的目的是提供ProgID,将其映射到CLSID,并为组件支持的接口(例如,IAudioSessionEvent的接口ID)提供接口ID。如果您正在实现DLL,则必须提供执行所有这些任务的代码。
注意:regsvr32调用这些函数以注册组件。
编写此代码非常不寻常,通常您会想要使用像ATL这样的框架,它会为您处理繁琐的工作。如果您真的想从底层了解COM,则编写此代码至少一次是很好的练习。

澄清一下,我正在实现相关的DLL。目前我尝试避免使用框架,因为我宁愿学习COM的整体知识而不是任何特定的框架。 - Kevin Montrose

0

实现自注册的最简单方法通常是使用ATL服务器类,创建一个从CComModule(或其他类似类)派生的全局变量,并在模块中定义COM_MAP。然后,您可以要求com模块根据您添加到项目中的.rgs文件来处理注册。


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