掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数の言語で設定されたexeファイルのバージョン情報を取得するには? (ID:18106)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
初めて質問させてもらいます。 とあるexeファイルのバージョン情報を取得したいと思い、 「About Delphi」のサイトのTips「リソースにあるバージョン情報を取得したい。」を参考に以下のようなコードを書きました。ほとんどコピペしただけですが・・・ /////////////////////////ここから function GetVerInfo(const FileName: String; KeyStr: String): String; var Handle, InfoSize, Len: DWORD; Data, Value: PChar; Buffer: Pointer; s: String; begin Result := ''; //バージョン情報のサイズを取得 Handle := 0; InfoSize := GetFileVersionInfoSize(PChar(FileName), Handle); if InfoSize > 0 then begin Data := AllocMem(InfoSize); try //バージョン情報の取得 Win32Check(GetFileVersionInfo(PChar(FileName), Handle, InfoSize, Data)); //言語識別子と文字セット識別子の取得 Win32Check(VerQueryValue(Data, PChar('\VarFileInfo\Translation'), Buffer, Len)); //バージョン情報値の文字列を作成 s := Format('\StringFileInfo\%4.4x%4.4x\%s', [LongRec(PDWORD(Buffer)^).Lo, LongRec(PDWORD(Buffer)^).Hi, KeyStr]); //バージョン情報取得 if VerQueryValue(Data, PChar(s), Pointer(Value), Len) then begin Result := Value; end; finally FreeMem(Data, InfoSize); end; end; end; procedure TForm1.Button1Click(Sender: TObject); var FileName: String; begin FileName := 'c:\hoge\hoge.exe'; *実際には目的のexeファイルにしてます* Memo1.Clear; with Memo1.Lines do begin Add('Comments=' + GetVerInfo(FileName, 'Comments')); Add('CompanyName=' + GetVerInfo(FileName, 'CompanyName')); Add('FileDescription=' + GetVerInfo(FileName, 'FileDescription')); Add('FileVersion=' + GetVerInfo(FileName, 'FileVersion')); Add('InternalName=' + GetVerInfo(FileName, 'InternalName')); Add('LegalCopyright=' + GetVerInfo(FileName, 'LegalCopyright')); Add('LegalTrademarks=' + GetVerInfo(FileName, 'LegalTrademarks')); Add('OriginalFilename=' + GetVerInfo(FileName, 'OriginalFilename')); Add('PrivateBuild=' + GetVerInfo(FileName, 'PrivateBuild')); Add('ProductName=' + GetVerInfo(FileName, 'ProductName')); Add('ProductVersion=' + GetVerInfo(FileName, 'ProductVersion')); Add('SpecialBuild=' + GetVerInfo(FileName, 'SpecialBuild')); end; end; /////////////////////////ここまで ところが実行してみるとバージョン情報が表示されません。Comments=までは表示されますが、その値が空欄になります。(CompanyNameなども同様です) ためしに他のexeファイルを対象にしたところ、情報を取得できるファイルとできないファイルがあるようです。 いろいろ調べたところ、取得できるのは「言語」に一つの言語が設定されているexeファイル、 できないのは「言語」に複数のの言語が設定されているexeファイルのようです。 次に、コードの各所にShowMessageを挟んでみたところ、複数の言語が設定されているファイルを対象にしたときは if VerQueryValue(Data, PChar(s), Pointer(Value), Len) then begin の部分でfalseが返されてそれ以降が実行されて無いようです。(2箇所の Win32Check〜〜 の文はtrueを返しました) そこでVerQueryValueをヘルプで調べようとしたのですが、ヘルプに載ってなくお手上げです。 複数の言語が設定されているexeファイルを対象にしても正常に実行されるようにするにはどうしたらいいのでしょうか? 長くなったのでまとめます。 1.あるexeファイルのバージョン情報を取得しようとしたが上手くいかない 2.情報を取得できないexeファイルを調べてみると、「言語」の欄に複数の言語が設定されているのがアヤシイ 3.情報を取得できないときは if VerQueryValue(Data, PChar(s), Pointer(Value), Len) then でfalseが返されてしまう 4.これを上手く実行させるにはどうしたらいいのでしょうか ちなみにバージョン情報を取得したいと思っている対象のexeファイルは http://64.simutrans.com/simuwin-86-10-4.zip からダウンロードできます。 最後に、自分の環境は、 Delphi 6 Personal + Windows2000 です。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.