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

时间:2008-11-12 21:09:40

标签: security winapi

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

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

HKEY_CLASSES_ROOT\TypeLib

而不是

HKEY_CURRENT_USER\Software\Classes\TypeLib

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

2008年5月,Microsoft发布了hotfix for 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); 

2 个答案:

答案 0 :(得分:6)

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

Register ATL as Normal User

答案 1 :(得分:5)

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