使用 DLL 中的 COM 对象,无需注册
Posted
技术标签:
【中文标题】使用 DLL 中的 COM 对象,无需注册【英文标题】:Use COM Object from DLL without register 【发布时间】:2012-06-20 17:46:06 【问题描述】:是否可以使用 DLL 中的 COM 对象而不在 C++ 非托管代码中注册?
【问题讨论】:
【参考方案1】:是的,如果它内部不依赖其他注册对象。
-
你
LoadLibrary
DLL
你GetProcAddress
它的DllGetClassObject
您调用DllGetClassObject
以获取IClassFactory
指向感兴趣的CLSID
的指针
您可以使用 IClassFactory::CreateInstance
并实例化 coclass
【讨论】:
2½。在致电DllGetClassObject
之前,请确保您在正确的公寓内。即便如此,您也不会得到特定对象模型接口的封送处理。即使 C++ COM 对象自己实现 IMarshal
或 IProvideClassInfo
,如果您是提供实现这些接口(例如事件调度接口)的对象的人,您也需要这样做。由于这些原因和许多其他原因,这是不好的做法。您应该改用免注册 COM。【参考方案2】:
您可以为 DLL 创建清单文件并使用 Registration-Free COM。
【讨论】:
【参考方案3】:假设需要注册 COM DLL,但应用程序没有管理员访问权限。这是在HKEY_CURRENT_USER
下注册 DLL 的简单技巧,不需要管理员权限:
-
使用
LoadLibrary
加载COM DLL。
拨打GetGetProcAddress
获取DllRegisterServer
的地址。
调用RegOverridePredefKey
使临时注册表重定向:HKEY_LOCAL_MACHINE
到HKEY_CURRENT_USER
和HKEY_CLASSES_ROOT
到HKEY_CURRENT_USER\Software\Classes
。
调用第二步得到的DllRegisterServer
。
反转注册表重定向。
照常使用 COM 服务器,它现在注册在 HKEY_CURRENT_USER
下。
【讨论】:
“简单”破解。不过很聪明。以上是关于使用 DLL 中的 COM 对象,无需注册的主要内容,如果未能解决你的问题,请参考以下文章
通过注册的 TLB 从 python 访问未注册的 COM 对象
如何使用 Windows Installer XML 注册 COM 对象