基本上我认为这是 Windows Server 2008 中的一个错误,但我不是 COM 忍者,所以我似乎同样可能只是在做一些愚蠢的事情。问题是:错误还是程序员错误?
我们使用 WinHttpRequest(WinHttp 的 ActiveX 组件)来读取 http:// 和 https://。我们用来查找组件的 ProgID 是WinHttp.WinHttpRequest.5.1.
我们的应用程序在 XP 和 Windows Server 2003 上运行良好。在 Windows Server 2008 下,我们会收到一个错误 ( 0x800029C4A "Error loading type library/DLL") 加载类型库。重新注册 winhttp 可以解决问题。问题是,为什么?
经过无数次死胡同,我在注册表中找到了以下内容。
已安装的 Windows 2008 Server SP2:
Name=HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{662901FC-6951-4854-9EB2-D9A2570F2B2E}\5.1\0\win32=%SystemRoot%\system32\winhttp.dll
Type=REG_SZ
Data=%SystemRoot%\system32\winhttp.dll
调用后regsvr32 %SystemRoot%\System32\WinHttp.dll,此键更改值:
Name=HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{662901FC-6951-4854-9EB2-D9A2570F2B2E}\5.1\0\win32
Type=REG_SZ
Data=C:\Windows\system32\winhttp.dll
我的理解是,类型的键会REG_EXPAND_SZ扩展系统路径,%SystemRoot%但REG_SZ不会。所以要么类型应该是REG_EXPAND_SZ,要么应该使用扩展路径。重新注册 WinHttp 会修复路径,从而修复 WinHttpRequest。(据我所知,XP 使用过C:\Windows\System32\winhttp.dll,Server 2003 使用过适合我的 SxS 安装>0
所以我认为这是一个错误,我向微软提交了一个错误(或者至少我可以从 connect.microsoft.com 的沼泽中做的一样多。)但这是我没有得到的部分:因为 Windows Server 2008 和 Vista 非常相似,这个问题似乎也存在于 Vista 中。WinHttpRequest 必须是一个常用的对象。群众应该尖叫,但经过大量谷歌搜索后,我发现只有一个线程有人遇到这个问题。
重新注册 winhttp 解决了这个问题,所以这就是我们正在做的事情。我发布这个是因为 a)我无法相信重新注册这个常用组件是最佳实践,并且 b)如果它是一个错误,也许这会对其他人有所帮助。
-抢