1

私のプログラムは、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 になったことです。

賞金稼ぎへの注意:

私がこのシステムにアクセスできるのは 1 日に数時間 (EST の 0:00 頃) だけなので、あなたの提案に迅速な回答が得られないかもしれませんが、調査します。

確認すべき事項 (レジストリ値など) があると思われる場合は、具体的に記入してください。

追加するために編集:

CreateInstance を初めて呼び出すと、0x80040154 ではなく 0x80070002 が返されることがわかりました。

4

1 に答える 1

4

それを診断するのは非常に難しいでしょう。ShellWindows コクラスは特殊で、その CLSID レジストリ キーはHKEY_CLASSES_ROOT\CLSID\{9BA05972-F6A8-11CF-A442-00A0C90A8F39}. そこを見ると、そこには有用な登録が何もないことがわかります。これは、Windows シェルを Web ブラウザに似せようとする不運な試みの名残です。シェル ウィンドウを列挙すると、Windows Explorer と Internet Explorer の両方のインスタンスが返されます。

SysInternals の ProcMon ユーティリティは、ほとんどの場合、0x80040154 エラーをデバッグするための武器として選択されますが、ここでは役に立ちません。レジストリを調査し、探しているものが見つからないことがわかりますが、プログラムはとにかく ieframe.dll をロードする方法を知っています。これは、CoCreateInstance() 呼び出しをインターセプトするオペレーティング システムによってのみ機能します。コクラスがシェルウィンドウを列挙することを考えると、これは一般的に理にかなっています。

あとは試行錯誤のアプローチだけです。最初に IE を再インストールし、次に OS を再インストールします。または、貴重な時間を無駄にする前に、4 階の窓から機械を押し出すこともできます。

于 2012-11-26T19:28:17.070 に答える