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で比較してみると。。。

Windows 2000とXPのOLEAUT32 の違い

見たところ 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については、利用アプリが見つからなかったので、もうちょっと調べてみます。。。多分、続く

おすすめ

3件のフィードバック

  1. 通りすがり より:

    > 実は OLEAUT32.DLLはVisual BASIC6のランタイムですが
    OLE関連のシステムDLLです。
    VC++でもATLなどが使用します。

  2. 通りすがり より:

    > 実は OLEAUT32.DLLはVisual BASIC6のランタイムですが
    OLE関連のシステムDLLです。
    VC++でもATLなどが使用します。

  3. 通りすがり より:

    > 実は OLEAUT32.DLLはVisual BASIC6のランタイムですが
    OLE関連のシステムDLLです。
    VC++でもATLなどが使用します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です