Windows 2000とXPで違う、shell32.dll/shlwapi.dll/msi.dll の共通点

以前、Windows XP 互換モードで Windows 2000のアプリを動かしたら、動かなくなる原理を説明したと思いますが、もっかい復習かねてまとめておきました ・ω・

そんなの記憶にねーぞって人はImage List でググってもらえるといいかと

まず、Windows XP と 2000で、Shell Item Image List の構造体の配置が全然違う。
でも、IE6 SP1に入ってる shlwapi.dll は XP SP1と Windows 2000で 全く同じものです。

どうしてるか?

実は、 SHELL32.dll でOS判定をして、SHLWAPI の関数を呼び出すときにXP用の処理とWin2000用の処理を振り分けて処理をしている。

例えば、拡張カーネルの入っていない Windows 2000で、explorer.exe をXP互換モードで起動すると、アイコンが一切表示できなくなってしまったり、フォルダダイアログが正常に動作しなくなる。

同じ様なことを、実は Windows Installer もやっている。

Windows Installer 3.x は、 msi.dll は XP も Windows 2000も共通のファイルを使っています。
でも、これが RPC (リモートプロシージャーコール)の関数を呼び出すときは、それぞれ、独自のパラメータを渡さなくてはいけない。

どうしているか。

msiexec.exe が起動された OSのバージョンをチェックして、 XP用の処理と、 Windows 2000用の処理に振り分けてるのだ。
ちなみに、私が、 WLU で公開しているWindows 7偽装 対応版 は、いかなるOS判定があっても、Windows 2000の処理に飛ぶように小細工している。

単純なインストーラーの場合は、RPCのAPIが呼ばれないため、XP用の処理に飛ぶ状態でも、正常にインストールが完了してしまうこともある。

ところが、 Windows Installer 4.5 のバイナリを見てみた所、Windows 2000用の分岐処理がすっぽりなくなってるのだ ・ω・(真顔)

つまり、MSIの中で、RPC が呼ばれるような複雑な命令があると、失敗して、インストールが正常にできないアプリも出てきてしまう。
以前 拡張カーネルの途中バージョンで インストールできないインストーラーがあるってコメントをもらって困ったことがあったが、RPCの処理がXPと2000で分岐してることを考慮していなかったために発生した問題なのだ

『でも、それじゃあ、Windows Installer 4.5 専用アプリがインストールできないじゃないか!』と思うかもしれない。

でも、ORCAで MSI の中身を一回全部エクスポートした後、新規で 作り直し、全部インポートしなおせばインストールできるようになる物もあるのだ

おすすめ

コメントを残す

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