SHDocVw :: IShellWindowsPtr失败了IE8? (错误0x80040154)

时间:2012-11-20 07:56:25

标签: c++ com internet-explorer-8 mshtml

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

最近我把它掸掉并运行了,但下面的最后一行因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点左右),因此您可能无法快速回复您的建议,但我查看它们。< / p>

如果您认为我应该检查的内容(例如注册表值),请具体。

已编辑添加:

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

1 个答案:

答案 0 :(得分:4)

非常难以诊断。 ShellWindows coclass很特殊,其CLSID注册表项为HKEY_CLASSES_ROOT\CLSID\{9BA05972-F6A8-11CF-A442-00A0C90A8F39}。当你看到那里时,你会发现那里没有任何有用的东西。背景故事是,这是使Windows外壳类似于Web浏览器的不幸命运的遗留物。今天仍然可见,枚举shell窗口将返回Windows资源管理器和Internet Explorer实例。

SysInternals的ProcMon实用程序几乎总是调试0x80040154错误的首选武器,但它在这里没有变化。您可以看到它探测注册表,而不是找到它正在寻找的内容,但程序知道如何加载ieframe.dll。这只能通过拦截CoCreateInstance()调用的操作系统来工作。考虑到coclass枚举shell窗口,这一般是有道理的。

你剩下的就是试错法。首先重新安装IE,接下来是OS。或者,在将机器耗尽太多宝贵的时间之前,将机器推出第4层的窗口。