我对“传统”的工作有很好的了解.dll
。还有 和 之间的区别dynamic loading
等等static loading
。
但我对 COM 对象的工作有以下疑问,
- 是否必须使用 注册 COM 对象
regsvr32
? COM object
我可以在相同/不同的目录中注册两个版本吗?.dll
除了被打包在 .dll 文件中之外,“传统”和.dll 文件之间还有什么共同点COM object
吗?
是的,COM 程序集已注册,以便 COM 基础结构知道它们存在。DLL 是通过注册 CLSID 而不是路径找到的。
如果两个版本具有不同的名称,则它们可以共存(显然,文件夹中不能有相同的命名文件)。
所有 COM 对象都实现了特定的接口(IUnknown,很多都有 IDispatch)。COM 的工作原理实际上是一个超出我们可以在此处发布的主题的方式。你可能会得到一本 ATL Internals 之类的书,或者阅读一些在线 COM 教程。
1) 否 - 不需要注册 COM对象。需要注册才能创建新的COM 对象。有许多需要 COM 对象的接口(COM 或本机函数)。他们的 API 告诉你你的 COM 对象应该支持哪个接口。由于您传入一个现有的 COM 对象,因此它们不需要注册信息来创建您的 COM 对象。此方案的一个变体是运行对象表,您可以在其中注册创建的 COM 对象。这些对象也是您创建的,您不需要注册信息。
示例界面:IQueryCancelAutoplay。
2) COM对象存在于内存中。您可能正在考虑一个 COM类,它与它的 COM 工厂一起在 DLL 中实现。COM 类由它们的 GUID 注册。您可以有多个类=每个 DLL 的 GUID,但每个类只有一个 DLL。请记住,调用者向 COM 请求您的类的一个实例。如果有两个 DLL 实现同一个类,COM 会加载哪个 DLL?!当然,可以有两个 DLL,每个 DLL 都实现一个类,这两个类共享一些接口。他们将始终共享 IUnknown,例如,通常是 IDispatch,但很少是 IAcmeCorpFooBrv2
3) COM DLL是一个普通的 DLL,它 (a) 公开了一些特定于 COM 的函数,并且 (b) 已注册,因此 COM 框架可以在其上调用 LoadLibrary。DLL 还可能公开其他非 COM 函数。因此,您可以自己在 COM DLL 上调用 LoadLibrary。这有时对减少创建第一个 COM 对象所涉及的延迟很有用。
1)如果您不使用名为Reg-Free COM 的东西,则必须注册它
2)不能注册两个具有相同CLSID 到ProgID 映射的COM 对象。
3)最终,传统的 dll 和 COM dll 都包含机器代码。如果不是为了实现接口,那么您编写代码的方式也没有太大区别。