アタッシェケースをはじめとして、作成したアプリケーションのバージョン番号を上げるとき、各所に埋め込まれた番号を編集するのが面倒で、よくミスをしていました。
そのため、途中からWin32 APIを使って実行ファイル自身から取得するようにしています(そうすれば一箇所の編集で済みます)。
[cpp]
LPVOID* pVersionInfo;
String FileVersion = ""; //ファイルバージョン
DWORD dwInfoSize;
DWORD dwHandleTemp = NULL;
LPVOID lpLang = NULL;
UINT dwLength;
WORD* lpTranslate;
String SubBlock;
LPVOID lpInfoItem = NULL;
String Result="";
//バージョン情報のサイズを取得する
dwInfoSize = GetFileVersionInfoSizeW(Application->ExeName.c_str(), &dwHandleTemp);
pVersionInfo = new LPVOID[dwInfoSize];
if(GetFileVersionInfoW(Application->ExeName.c_str(), dwHandleTemp, dwInfoSize, pVersionInfo)){
//言語IDとキャラクタIDを取得する
if (VerQueryValue(pVersionInfo, TEXT("\\VarFileInfo\\Translation"), &lpLang, &dwLength)){
lpTranslate = (WORD*)lpLang;
//ファイルバージョン
SubBlock.sprintf(L"\\StringFileInfo\\%04x%04x\\FileVersion", *lpTranslate, *(lpTranslate + 1));
if ( VerQueryValueW(pVersionInfo, SubBlock.w_str(), &lpInfoItem, &dwLength) ){
Result.sprintf(L"%s", lpInfoItem);
// "2.7.4.0" などという文字列が入ります
FileVersion = Result;
}
}
}
[/cpp]
さらに最近は、それさえも面倒になってきたので、クラスとしてひとまとめにしました。
ダウンロードはこちら↓
ソースは無保証の代わりに、特に使用条件はありません。改造、転載はご自由にどうぞ。
基本的には、C++Builderでの動作確認のみですが、書き換えれば、Visual Studioでもいけると思います。
コンストラクタですべての情報を取得して、各メンバ変数にぶち込んでます。
ですので、使い方は単純です。↓
[cpp]
#include "GetAppInfoString.h"
TGetAppInfoString *pAppInfoString = new TGetAppInfoString();
Memo1->Lines->Add(pAppInfoString->Comments); //コメント
Memo1->Lines->Add(pAppInfoString->InternalName); //内部名
Memo1->Lines->Add(pAppInfoString->ProductName); //製品名
Memo1->Lines->Add(pAppInfoString->CompanyName); //会社名
Memo1->Lines->Add(pAppInfoString->LegalCopyright); //著作権
Memo1->Lines->Add(pAppInfoString->ProductVersion); //製品バージョン
Memo1->Lines->Add(pAppInfoString->FileDescription); //説明
Memo1->Lines->Add(pAppInfoString->LegalTrademarks); //商標
Memo1->Lines->Add(pAppInfoString->PrivateBuild); //PrivateBuild
Memo1->Lines->Add(pAppInfoString->FileVersion); //ファイルバージョン
Memo1->Lines->Add(pAppInfoString->OriginalFilename); //正式ファイル名
Memo1->Lines->Add(pAppInfoString->SpecialBuild); //SpecialBuild
delete pAppInfoString;
[/cpp]
このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。
日々の開発作業で気づいたこと共有を。同じところで躓いている人が、 検索で辿り着けたら良いな、というスタンスで記事を書くので不定期更新になります。
コメントする