2012-11-20 68 views
1

我的程序是一个挂钩到IE的运行实例的DLL。多年来它工作得很好。SHDocVw :: IShellWindowsPtr与IE8失败? (错误0x80040154)

最近我撒其关闭,并运行它,但低于最后一行失败,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的不是。

+0

0x80040154是'班级未注册'。也许是一个32/64位的问题? –

+1

您有'0x80040154'' REGDB_E_CLASSNOTREG'“类未注册”错误。最有可能的是你没有安装这个组件。至少,这是首先要检查的内容:如果你有任何这个'CLSID'的条目,并且它们指向一个健康的DLL,请查看注册表。 –

+0

然后接下来的事情 - 如果DLL看起来很好 - 是创建一个空的项目,例如控制台C++应用程序,它只是简单地执行'CoInitialize'和'CoCreateInstance',即在IE之外,并运行它来查看是否可以实例化类。 –

回答

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。或者在它消耗了太多宝贵的时间之前将机器推出第四层窗户。

+0

+1这实际上非常有用,因为它可以帮助我解决一些死路。 – egrunin

+0

+1对于一些了不起的建议和第四层窗口。你总是有这么棒的职位。 –