我对“传统”.dll
的工作有很好的了解。还有dynamic loading
和static loading
等之间的差异
但我对COM对象的工作有以下疑问,
regsvr32
注册COM对象?COM object
放在同一/不同的目录中吗?.dll
和COM object
之间有什么共同点吗?答案 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都包含机器代码。如果不是用于实现接口,那么编写代码的方式也没有太大区别。