Win32:如何使用标准用户的RegisterTypeLib API

Ian*_*oyd 6 security winapi

Win32 API调用RegisterTypeLib()用于创建注册类型库所需的注册表项.

不幸的是,在Windows XP上,它尝试将这些注册表项条目写入

HKEY_CLASSES_ROOT\TypeLib
Run Code Online (Sandbox Code Playgroud)

而不是

HKEY_CURRENT_USER\Software\Classes\TypeLib
Run Code Online (Sandbox Code Playgroud)

这意味着标准用户将无法运行ActiveX.

2008年5月,微软发布了一个针对Vista修补程序来解决这个问题 - 但问题仍然存在于Windows XP上.

什么是标准用户友好的开发人员?


答案1

使用为其设计的API调用:

RegisterTypeLibraryForUser()

答案2

如果你无法解决它,那就破解它:

//begin hack
HKEY key;
RegOpenKeyW(HKEY_CURRENT_USER, @"Software\Classes", out key);
RegOverridePredefKey(HKEY_CLASSES_ROOT, key);

//do original work
RegisterTypeLibrary(...)

//stop hacking
RegOverridePredefKey(HKEY_CLASSES_ROOT, null);
RegCloseKey(key); 
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 6

看看我写的这篇博文.它将使用RegOverridePredefKey将ATL COM对象注册到HKCU而不是HKCR.您可以使用相同的技术调用RegisterTypeLib并在HKCU下正确注册

将ATL注册为普通用户


Mic*_*urr 5

您可以使用RegOverridePredefKey()API将HKEY_CLASSES_ROOTregtree 映射到HKEY_CURRENT_USER\Software\Classes:

  • 从Windows Vista SP1开始,应调用“ OaEnablePerUserTLibRegistration”,以允许正在运行的应用程序中的用户使用RegisterTypeLibrary。仅调用“ RegisterTypeLibrary”是不够的。MSDN:https://msdn.microsoft.com/zh-CN/library/windows/desktop/cc713570(v=vs.85).aspx (2认同)