C++ SHDocVw::IShellWindowsPtr在IE8中失败?(错误0x80040154)

C++ SHDocVw::IShellWindowsPtr在IE8中失败?(错误0x80040154),c++,com,internet-explorer-8,mshtml,C++,Com,Internet Explorer 8,Mshtml,我的程序是一个链接到IE运行实例的dll,多年来一直运行良好 最近我掸掉灰尘并运行了它,但下面的最后一行失败,hr=0x80040154: IE7被IE8取代有关系吗?我还应该去哪里看 如果有必要的话,我正在使用VS2008 编辑以添加 我不认为这可能是一个32/64位的问题-它去年在同一台机器上运行良好。据我所知,唯一改变的是IE的版本,从7到8 赏金猎人注意: 我每天只能在美国东部时间0:00左右访问这个系统几个小时,所以你可能不会对你的建议做出快速反应,但我会调查他们 例如,如果您认为我应

我的程序是一个链接到IE运行实例的dll,多年来一直运行良好

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

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

如果有必要的话,我正在使用VS2008

编辑以添加

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

赏金猎人注意:

我每天只能在美国东部时间0:00左右访问这个系统几个小时,所以你可能不会对你的建议做出快速反应,但我会调查他们

例如,如果您认为我应该检查注册表值,请具体说明

编辑以添加:

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

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

SysInternals的ProcMon实用程序几乎总是调试0x80040154错误的首选工具,但在这里它没有什么用处。您可以看到它探测注册表,但没有找到它要查找的内容,但是程序知道如何加载ieframe.dll。这只能通过操作系统拦截CoCreateInstance调用来实现。考虑到coclass枚举shell窗口,这通常是有意义的

你只剩下尝试和错误的方法了。首先重新安装IE,然后重新安装OS。或者在机器占用你太多宝贵的时间之前把它从四层楼的窗户里推出来。

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

SysInternals的ProcMon实用程序几乎总是调试0x80040154错误的首选工具,但在这里它没有什么用处。您可以看到它探测注册表,但没有找到它要查找的内容,但是程序知道如何加载ieframe.dll。这只能通过操作系统拦截CoCreateInstance调用来实现。考虑到coclass枚举shell窗口,这通常是有意义的


你只剩下尝试和错误的方法了。首先重新安装IE,然后重新安装OS。或者在机器占用您太多宝贵的时间之前,将其从四层楼的窗口中推出。

0x80040154是“未注册的课程”。可能是32/64位问题?您有0x80040154 REGDB_E_CLASSNOTREG类未注册错误。最可能的情况是您没有安装此组件。至少,这是第一个要检查的:如果你有任何关于这个CLSID的条目,如果他们指向一个健康的DLL,那么看看下一个东西——如果DLL看起来对你好——就是创建一个空的项目,例如控制台C++应用程序,它只需初始化和合并实例,即在伊江之外。然后运行它,看看这个是否可以实例化这个类。@RomanR:从代码中可以看到,本例中的DLL是shdocvw.DLL。如果Vista没有完全崩溃,这怎么会变得糟糕呢?正如我提到的,这段代码去年在同一台机器上运行良好。据我记忆所及,唯一的变化是IE8。它不必完全破坏它,尤其是当您的操作系统是x64,并且您看到的大多数shell都是x64时,就不一定了,而不是这个所谓的Win32代码。问题是,坏掉的系统是你的,应该很容易尝试,对其他人来说很难尝试——他们一开始就没有你的挂钩项目。0x80040154是“类未注册”。可能是32/64位问题?您有0x80040154 REGDB_E_CLASSNOTREG类未注册错误。最可能的情况是您没有安装此组件。至少,这是第一个要检查的:如果你有任何关于这个CLSID的条目,如果他们指向一个健康的DLL,那么看看下一个东西——如果DLL看起来对你好——就是创建一个空的项目,例如控制台C++应用程序,它只需初始化和合并实例,即在伊江之外。然后运行它,看看这个是否可以实例化这个类。@RomanR:从代码中可以看出,t中的DLL
他的案子是shdocvw.dll。如果Vista没有完全崩溃,这怎么会变得糟糕呢?正如我提到的,这段代码去年在同一台机器上运行良好。据我记忆所及,唯一的变化是IE8。它不必完全破坏它,尤其是当您的操作系统是x64,并且您看到的大多数shell都是x64时,就不一定了,而不是这个所谓的Win32代码。问题是,坏掉的系统是你的,应该很容易尝试,对其他人来说很难尝试——他们一开始就没有你的挂钩项目。+1这实际上非常有用,因为它可以避免我陷入一些死胡同。+1获得一些很棒的建议和第四层的窗口。你总是有这么好的帖子。+1这实际上非常有用,因为它可以避免我陷入一些死胡同。+1寻求一些很棒的建议和第四层的窗口。你总是有这么好的帖子。
#import <mshtml.tlb>     rename("value", "theValue") rename("event", "theEvent")
#import <shdocvw.dll> 

// ....

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