1

我的程序是一个 DLL,它连接到一个正在运行的 IE 实例。多年来一直运行良好。

最近我把它掸掉并运行它,但下面的最后一行失败了hr = 0x80040154

#import <mshtml.tlb>     rename("value", "theValue") rename("event", "theEvent")
#import <shdocvw.dll> 

// ....

SHDocVw::IShellWindowsPtr spSHWinds;
HRESULT hr = m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));

IE7被IE8取代有关系吗?我还应该去哪里看?

如果这很重要,我正在使用 VS2008。

编辑添加

我不认为这可能是 32/64 位问题 - 去年它在同一台机器上运行良好。唯一改变的(据我所知)是 IE 的版本,从 7 到 8。

赏金猎人注意事项:

我每天只能访问该系统几个小时(美国东部标准时间 0:00 左右),因此您可能无法快速回复您的建议,但我调查他们。

如果您认为我应该检查一些事情(例如注册表值),请具体说明。

编辑添加:

我现在看到我一次调用 CreateInstance 时,它​​返回 0x80070002,而不是 0x80040154。

4

1 回答 1

4

这将很难诊断。ShellWindows coclass 是特殊的,它的 CLSID 注册表项是HKEY_CLASSES_ROOT\CLSID\{9BA05972-F6A8-11CF-A442-00A0C90A8F39}. 当你看那里时,你会看到那里没有注册任何有用的东西。背景故事是,这是使 Windows shell 类似于 Web 浏览器的一次不幸的尝试的残余。今天仍然可见,枚举 shell 窗口会返回 Windows Explorer 和 Internet Explorer 实例。

SysInternals 的 ProcMon 实用程序几乎始终是调试 0x80040154 错误的首选武器,但在这方面表现平平。您可以看到它正在探测注册表,但没有找到它要查找的内容,但随后程序知道如何加载 ieframe.dll。这只能通过拦截 CoCreateInstance() 调用的操作系统起作用。考虑到 coclass 枚举 shell 窗口,这通常是有道理的。

剩下的就是试错法。先重装IE,再重装OS。或者在它占用你太多宝贵时间之前把它从 4 楼的窗户里推开。

于 2012-11-26T19:28:17.070 回答