使用 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 对象自己实现 IMarshalIProvideClassInfo,如果您是提供实现这些接口(例如事件调度接口)的对象的人,您也需要这样做。由于这些原因和许多其他原因,这是不好的做法。您应该改用免注册 COM。【参考方案2】:

您可以为 DLL 创建清单文件并使用 Registration-Free COM。

【讨论】:

【参考方案3】:

假设需要注册 COM DLL,但应用程序没有管理员访问权限。这是在HKEY_CURRENT_USER 下注册 DLL 的简单技巧,不需要管理员权限:

    使用LoadLibrary 加载COM DLL。 拨打GetGetProcAddress获取DllRegisterServer的地址。 调用RegOverridePredefKey 使临时注册表重定向:HKEY_LOCAL_MACHINEHKEY_CURRENT_USERHKEY_CLASSES_ROOTHKEY_CURRENT_USER\Software\Classes。 调用第二步得到的DllRegisterServer。 反转注册表重定向。 照常使用 COM 服务器,它现在注册在 HKEY_CURRENT_USER 下。

【讨论】:

“简单”破解。不过很聪明。

以上是关于使用 DLL 中的 COM 对象,无需注册的主要内容,如果未能解决你的问题,请参考以下文章

通过注册的 TLB 从 python 访问未注册的 COM 对象

如何找到哪个未注册的 DLL 正在实现 COM 对象?

为啥 C# 需要注册 COM DLL 才能引用它?

如何使用 Windows Installer XML 注册 COM 对象

为 ASP Classic 中的 COM 可见性注册 .NET DLL

如果 com dll 未注册,如何防止崩溃