在非托管的C++代码中,是否可能在不注册的情况下使用来自DLL的COM对象?
是的,如果它在内部不依赖其他已注册的对象。
LoadLibrary
加载 DLL。GetProcAddress
获取其 DllGetClassObject
函数指针。DllGetClassObject
来获取感兴趣的 CLSID
的 IClassFactory
指针。IClassFactory::CreateInstance
来实例化 coclass。假设 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
。HKEY_CURRENT_USER
下注册。OaEnablePerUserTLibRegistration
在DllRegisterServer
之前。只需要将HKEY_CLASSES_ROOT
映射到HKEY_CURRENT_USER\Software\Classes
即可。但是我可能漏掉了一些东西。 - phetdam
DllGetClassObject
之前,请确保你在正确的公寓中。即使如此,你也不会为特定对象模型接口获得编组。即使C++ COM对象本身实现了IMarshal
或IProvideClassInfo
,如果你提供了实现任何这些接口的对象(例如事件分发接口),你仍需要执行相同的操作。因为这些原因和许多其他原因,这是一种不好的做法。你应该使用注册自由的COM。 - acelent