有关COM / ActiveX对象的问题

时间:2009-01-14 14:20:39

标签: c++ c com dll activex

我对“传统”.dll的工作有很好的了解。还有dynamic loadingstatic loading等之间的差异

但我对COM对象的工作有以下疑问,

  • 是否必须使用regsvr32注册COM对象?
  • 我可以将两个版本的已注册COM object放在同一/不同的目录中吗?
  • 除了打包在.dll文件中之外,“传统”.dllCOM object之间有什么共同点吗?

3 个答案:

答案 0 :(得分:4)

是,已注册COM程序集,以便COM基础结构知道它们存在。通过注册CLSID而不是路径来找到DLL。

如果两个版本的名称不同,则它们可以共存(显然,您不能在文件夹中使用相同的命名文件)。

所有COM对象都实现特定的接口(IUnknown,许多都有IDispatch)。 COM如何工作确实是一种超出我们在此发布的主题方式。你可能会得到像ATL Internals这样的书,或者通过一些在线COM教程。

答案 1 :(得分:4)

1)否 - 没有必要注册COM 对象。需要注册才能创建 COM对象。有许多需要COM对象的接口(COM或本机函数)。他们的API告诉您COM对象应该支持哪个接口。由于传入现有COM对象,因此它们不需要注册信息来创建COM对象。此场景的一个变体是RUNning对象表,您可以在其中注册创建的COM对象。这些对象也是由您创建的,您不需要注册信息。

示例界面:IQueryCancelAutoplay。

2)内存中存在COM 对象。您可能正在考虑COM ,在DLL及其COM工厂中实现。 COM类由其GUID注册。每个DLL可以有多个类= GUID,但每个类只有一个DLL。请记住,调用者要求COM提供您的类的实例。如果有两个DLL实现相同的类,那么COM将加载哪个DLL?! 当然,可以有两个DLL,每个DLL实现一个类,其中两个类共享一些接口。他们将永远共享IUnknown,例如,经常IDispatch,但很少IAcmeCorpFooBarv2

3)COM DLL 一个普通的DLL,它(a)暴露了一些特定于COM的函数,并且(b)被注册,因此COM framewrok可以在其上调用LoadLibrary。 DLL还可能暴露其他非COM函数。因此,您可以自己在COM DLL上调用LoadLibrary。这有时可以减少创建第一个COM对象所涉及的延迟。

答案 2 :(得分:3)

1)如果您没有使用名为Reg-Free COM

的内容,则必须注册

2)无法注册两个与ProgID映射具有相同CLSID的COM对象。

3)最终传统的dll和COM dll都包含机器代码。如果不是用于实现接口,那么编写代码的方式也没有太大区别。