INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
本業の方のお仕事が再び忙しくなりつつあるので、断続的にしばらく更新が止まることがあります。

目次 | ←前へ / 2014-10-15 00:00 / 次へ→ / 最新へ⇒

■exeファイル自分自身の存在するフォルダ名が取得できなくなっちゃって…

2014/10/15 0:00:00


RSSRSS配信中

https://www.inasoft.org/








Windows 10 Technical Previewを使った各種実験の中で、exeファイル内のリソース内の「バージョン情報」が取得できなくなるトラブルに見舞われることがあった。
大半のプログラムはできているのだが、一部のプログラムだけそれができなくなった。
どういう条件下でできなくなるのか? プログラムのソースコードを眺めても、うまくできているプログラムと、うまくいかないプログラムの差が分からない。というか、差が無い。原因がさっぱり分からない…。

ちなみに、ソースコードの大まかな流れは下記の通り。

1. GetModuleFileName() API で、自分自身のexeファイルのフルパスを取得する
2. GetFileVersionInfoSize() API に、1.で得られたファイル名のフルパスを入れ、バージョン情報のサイズを取得する。
3. 2.で得られたサイズだけメモリを確保する。
4. GetFileVersionInfo() API に、1.で得られたファイル名のフルパスを私、3.で確保したメモリに情報を取得する。
5. VerQueryValue() API で必要な情報を取得する。

それほど難しいものではないし、過去10年近く動いているものであるから、いきなりここで失敗する理由がよく分からない。
Windows 10 Technical Previewのバグか!? とも思われたんだけど、詳細を調べてみると、すでに2.の時点で失敗していることが判明。もしかしたら、1.で得られているexeファイルのフルパスがおかしいんじゃないの?と思って調べたら、ビンゴでした。

今回、Windows 10 Technical Previewは英語(English - US)を既定に動作させているのですが、今回たまたま、うまく動かなかったプログラムだけ、フォルダ名の中に漢字が含まれていたんですね。

GetModuleFileName()は、WideChar版(W)ではなく MultiByte版(A)の関数を使っていたため、その漢字の部分をうまいこと内部コードに変換することができず、漢字の部分が「?」(クエスチョンマーク)にされてしまい、おかしな事になってしまいました。

実はこの問題、Windows 7の日本語環境であっても、フォルダ名にアラビア文字やハングル文字などのような、Shift-JISで表現できない範囲の文字を入れてしまうと、同様の現象が起きます。というわけで、この現象は、今まで表面化していなかった問題が、表面化しただけだったというわけですね。

まさか、Windows 10 Technical Previewで動作確認していて、Windows 10にあまり関係の無い問題を発見してしまうことになるとは…、ビックリです。

というわけで、INASOFTで公開しているMultiByte版のプログラム(ほとんど少数派になってしまいましたが)については、次回以降の更新から「exeファイル自分自身の存在するフォルダ名に解釈不可な文字が含まれていた場合は、その場でエラー原因を表示して動作を停止する」ような改修を入れておきたいと思います。

トラブルが発生する場所は、バージョン情報を取得する箇所だけでなく、カレントフォルダを変更する処理や、カレントフォルダからファイルを読み書きしようとする処理など、様々な箇所に波及するはずなので、安易に見えている問題だけを解決するのではなく、完全に動作を止めてフォルダ名を変えてもらう運用としたいと思います。






目次 | ←前へ / 2014-10-15 00:00 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。




2559145 (+0153)[+0619]

Copyright© 2010-2021 INASOFT