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上.
什么是标准用户友好的开发人员?
使用为其设计的API调用:
如果你无法解决它,那就破解它:
//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)
看看我写的这篇博文.它将使用RegOverridePredefKey将ATL COM对象注册到HKCU而不是HKCR.您可以使用相同的技术调用RegisterTypeLib并在HKCU下正确注册
您可以使用RegOverridePredefKey()API将HKEY_CLASSES_ROOTregtree 映射到HKEY_CURRENT_USER\Software\Classes: