November 25, 2014

『有効なWin32アプリケーションではありません』に対処

先日MFT2014というイベントがありまして、多くの方にあらちょっとすごいロガーもうちょっとすごいロガーちょっとすごいロガーをお披露目させていただきました。その節はありがとうございます。実は展示開始するまでに悪戦苦闘していたことがありまして、今回はそのことを記事にしてみようと思います。

事は、ちょっとすごいロガーをPCの外付けセンサとして使うデモ展示をしようとした際に起きました。展示用PCとして、Windows XP SP3が入ったものを確保したのですが、いな様作のデモソフトNinjaScan_GUIの公開バイナリをそこに入れて実行してみたところ『有効なWin32アプリケーションではありません』というダイアログがでて全く起動しないのです。NinjaScan_GUIはVisual C#で書かれているので、.NET関係のトラブルかと思い、とりあえず.NET 3.5、そして.NET 4.0の最新版を入れてみたのですが、やはり症状が変わりません。

色々調べてみると、バイナリの中で起動できる最低Windowsバージョンの指定がされていることがわかりました。dumpbinというVisual Studio付属ツールでヘッダを覗いてみる(dumpbin /headers)(リンク先20-6参照)と、その設定がわかります。さらに、たちの悪いことに、最近のVisual Studioでは特段の指定をしないとWindows XPがはじかれるように初期設定がされています(リンク先のDefault Values)。NinjaScan_GUIはソースが公開されているので、設定変更の上、再ビルドをすれば完全解決できます。しかし、便利なツールを運良く見つけられました。

使ったツールはChange-SubsystemVersionというもので、バイナリヘッダのうち最低Windowsバージョンを規定している部分(SubsystemVersion)を直接書き換えてくれます。書き換えた部分に合わせてチェックサムの調整もしてくれているようです。このツールを使って、exeバイナリをWindows XP以降(subsystem revision 5.01)に書き換えたところ、エラーが出ずに起動し、正常に動作することが確認できました。なおNinjaScan_GUIはいくつかのdllに依存しているのですが、そちらはXPでも動く要求になっていたので、特に書き換えずともすみました。

22:40 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/919