『有効な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でも動く要求になっていたので、特に書き換えずともすみました。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。