14

是否可以使用 DLL 中的 COM 对象而不在 C++ 非托管代码中注册?

4

3 回答 3

10

是的,如果它在内部不依赖其他注册对象。

  1. LoadLibrary是 DLL
  2. GetProcAddress它的DllGetClassObject
  3. 您调用DllGetClassObject以获取感兴趣的IClassFactory指针CLSID
  4. 你很适合去IClassFactory::CreateInstance实例化 coclass
于 2012-06-18T17:51:54.800 回答
7

您可以为 DLL 创建清单文件并使用无注册 COM

于 2012-06-18T17:59:53.717 回答
3

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

  1. 用于LoadLibrary加载 COM DLL。
  2. 打电话GetGetProcAddress获取地址DllRegisterServer
  3. 调用RegOverridePredefKey以使临时注册表重定向:HKEY_LOCAL_MACHINEtoHKEY_CURRENT_USERHKEY_CLASSES_ROOTto HKEY_CURRENT_USER\Software\Classes
  4. DllRegisterServer在步骤 2 中获得的调用。
  5. 反转注册表重定向。
  6. 像往常一样使用 COM 服务器,它现在注册在HKEY_CURRENT_USER.
于 2015-02-11T06:48:54.097 回答