バージョン情報の情報を取得する |
実行ファイルのプロパティーのバージョン情報から情報を取得する事で
例えばバージョンの管理を1つにまとめる事が出来ます。
今回は自分のファイルの製品バージョンを取得して表示させて見ます。
まずはソースを見てください。
DWORD dwLen; DWORD dwHandle; // バージョン情報リソースのサイズを取得 dwLen = ::GetFileVersionInfoSize(__argv[0], &dwHandle); if(dwLen) { // バッファの確保 char *lpData = new char[dwLen + 1]; if(lpData) { // バージョン情報リソースをバッファに読み込む if(::GetFileVersionInfo(__argv[0], 0, dwLen, lpData)) { UINT nLen; DWORD *dwLang; char lpSubBlock[50] = _T("\\VarFileInfo\\Translation"); // lang-codepageを取得 if(::VerQueryValue(lpData, lpSubBlock, (void **)&dwLang, &nLen)) { // lang-codepageをフォーマット char lpLang[9]; sprintf(lpLang, "%04x%04x", LOWORD(*dwLang), HIWORD(*dwLang)); // 情報を取得する LPTSTR lpBuffer; LPTSTR lpString = _T("ProductVersion"); // 製品バージョン名 sprintf(lpSubBlock, "\\StringFileInfo\\%s\\%s", lpLang, lpString); ::VerQueryValue(lpData, lpSubBlock, (void **)&lpBuffer, &nLen); // 表示 AfxMessageBox(lpBuffer); } } delete [] lpData; } } |
最初にGetFileVersionInfoSize()でリソースのサイズを取得します。
これで取得したサイズのバッファを用意しGetFileVersionInfo()でリソースを読み込みます。
読み込んだバッファからデータを取得するにはVerQueryValue()で取得しますが、
指定したデータを読み込むにはlang-codepageが必要です。
lang-codepageの取得もVerQueryValue()で行います。
2番目の引数に"\\VarFileInfo\\Translation"を指定してください。
そして取得したデータを次のようにしてフォーマットするとlang-codepageが取得できます。
> sprintf(lpLang, "%04x%04x",
LOWORD(*dwLang), HIWORD(*dwLang))
後はもう一度取得したlang-codepageを使ってデータを取得しなおします。
今回取得する情報は製品バージョンなのでstring-nameは"ProductVersion"です。
他の情報を取得する場合はこれを変えてください。
指定する名前はバージョン情報リソースのBlock Headerの名前を指定します。
後1つ重要な事ですが、ここで使用しているAPIを使うには"version.lib"をインポートする必要があります。
プロジェクトの設定でリンク>オブジェクト/ライブラリモジュールにversion.libを追記するか
ソースファイルの頭に以下のように記述してインポートしてやってください。
#pragma comment(lib, "version.lib")
< 戻る << HOME | ©1999-2001 by Akky, All right reserved. |