我的程序是一个连接到正在运行的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。
答案 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层的窗口。