ダウンロード: shimgvw_xp32.7z (ランチャーのバイナリとソースコードに加えて、英語版Windows XP SP3のshimgvw.dllが含まれています)。
これはどのように行われましたか?
Windows XPの標準の画像ビューアは、通常のアプリケーションではありません。 shimgvw.dllライブラリにあり、直接実行することはできません-少なくともrundll32が必要です (既存の画像ファイルへのパスが必要です):
rundll32 c:\windows\system32\shimgvw.dll,ImageView_Fullscreen c:\test.gif
しかし、Windows 7以降でWindows XPからshimgvw.dllを実行しようとすると、このトリックは機能しません。shimgvw.dllをロードできません。WindowsXPとの互換性モードが必要です。 これは、rundll32コピーに適切な互換モードを設定することで実現できますが、XPとの互換性は、アプリケーションのアクセス許可を最大に引き上げることを意味します。これにより、起動時にUACダイアログが表示されます。
デバッガーとのちょっとしたダンスが原因を突き止めました-起動プロセス中に、shimgvw.dllはその後、廃止されたシェル関数が保存されているshunimpl.dllからいくつかの関数をインポートしようとします。 、しかしすべての廃止された関数はエラーコードを返すだけです)。 XP互換モードは、とりわけこのATOMを設定するため、ビューアが起動します。
ATOM“ FailObsoleteShellAPIs”を追加し、どのイメージを開くかを尋ねる(パラメーターでパスが指定されていない場合)後、制御をshimgvw.dllに転送する小さなローダーを作成することにしました。 ビューアーは正常に動作しています(つまり、最初のタスクが完了しました)。したがって、shunimpl.dllからインポートされた古い関数や、どのような場合に使用されるかについては調査しませんでした。明らかに、ビューアーが動作するために重要なことは何もしません。
ローダーを実装するために少数のWinAPI関数以外は必要ないため、ランタイムを使用せずにClangを使用してプロジェクトをビルドする実験として決定しました(以前はこのようなダンスには常にMSVCを使用していました)。 したがって、14キロバイトの実行可能ファイルが取得され、そのうち9キロバイトがアイコンに移動しました。 誰かが非標準ライブラリに依存せずにガジェットを作成することを好む場合、このプロジェクトはClangを使用してこれを行う方法の簡単な例として役立ちます。