MSN ToolBarとIE6が不安定な理由?
Windows98/Me/2000ではAPPHELP.DLLが見つからなくて例外が出ることがあるようです。
そもそも、このAPPHELP.DLLとは何なのでしょうか?
DEPENDENCY WALKERでAPPHELP.DLLをエクスポートしているプログラムを調べてみると ApphelpCheckShellObjectという関数をインポートしています。
SHLWAPI.549: push ebp mov ebp,esp push ecx push ecx push esi mov esi,[ebp+18h] and dword ptr [esi],00000000h lea eax,[ebp-08h] push eax push 00000001h push [ebp+08h] call APPHELP.DLL!ApphelpCheckShellObject test eax,eax jnz $+7 mov eax,80070005h jmp $+12 |
見たところ、INDEX549のSHLWAPI.DLLが利用しているようですね。
ちなみに、このAPPHELP.DLLはWindowsXPのシステムファイルです。
IEのマルチ環境でIE5が Explorer.exeが例外で落ちるのですが、デバッガでコールスタックを見てみると、POPUPBLOCKが原因だとわかりました。
でも直前にOLEAUT32.DLLを呼んでいますね。
コールスタックのアドレスは0x63ff17e9ですから、直前のOLEAUT32呼び出しに問題があるということが分かります。
push [ebx] lea eax,[ebp-30h] push 00000000h push eax call [OLEAUT32.dll!OLEAUT32.146] mov esi,eax ;0x63ff17e9 lea eax,[ebp-18h] push eax call [OLEAUT32.dll!OLEAUT32.9] pop edi mov eax,esi pop esi |
実は OLEAUT32.DLLはVisual BASIC6のランタイムですが、OSによって異なるファイルが使用されることになっています。
実際にWindows 2000とXPで比較してみると。。。
見たところ Index:146には問題はないようですが、%PROGRAMFILES%\MSN Toolbar
Suite\pb\02.05.0000.XXXX\ja-jp\msnPopupBlocker.dll内の OLEAUT32.DLL を
OLEAUTXP.DLLに書き換えて、フォルダ内に XPのシステムファイルである
OLEAUT32.DLLをリネームして置いてみると、IE5でもエラーが出なくなります!
つまり、Microsoftはプラットフォームをまぜこぜにコンパイルしているので例外が多いという可能性が濃厚!?
さて、SHLWAPI.DLLの話に戻りますが、IE6のものをチェックしてみるとMPR.DLL のWNetRestoreConnectionAがエクスポートされていない事がわかります。この関数はSHLWAPI.390で使用されています。
SHLWAPI.390: push ebp mov ebp,esp sub esp,00000214h cmp dword ptr [0x70ACC620],00000000h jz $1 push [ebp+0Ch] push [ebp+08h] call jmp_MPR_dll_DelayImport_WNetRestoreConnectionW jmp $2 $1: push esi push [ebp+0Ch] lea ecx,[ebp-00000214h] call $3 push [ebp-00000210h] push [ebp+08h] call [MPR.dll!WNetRestoreConnectionA] lea ecx,[ebp-00000214h] |
幸いiexplore.exeはSHLWAPI.390とSHLWAPI.549を利用していません。
iexplorer.exeを調べてみると、BROWSEUI.DLLがXPのテーマコンポーネントであるUXTHEME.DLLを遅延ロードしていることも分かります。
直接呼んでないとはいえちょっと気持ち悪いですね。
ちなみに、IE5環境だと、MSN ToolBarをインストールしてもポップアップブロックやキーワードナビが使えないのですが、レジストリエディタで
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer]
"Version"="6.00.2800.1106"
にしてしまうと、アクティブになるようです。
んで、IE5環境で呼ばれるとどうもoleaut32.dllがXP互換モードでコールされるみたいなので上記の改変が必要になるような感じ。
う~ん。。。。きっとこれがマイクロソフトのクオリティなんだ!と納得しておきますかね。
APPHELP.DLLについては、利用アプリが見つからなかったので、もうちょっと調べてみます。。。多分、続く
> 実は OLEAUT32.DLLはVisual BASIC6のランタイムですが
OLE関連のシステムDLLです。
VC++でもATLなどが使用します。
> 実は OLEAUT32.DLLはVisual BASIC6のランタイムですが
OLE関連のシステムDLLです。
VC++でもATLなどが使用します。
> 実は OLEAUT32.DLLはVisual BASIC6のランタイムですが
OLE関連のシステムDLLです。
VC++でもATLなどが使用します。