| バージョン情報の情報を取得する |
実行ファイルのプロパティーのバージョン情報から情報を取得する事で
例えばバージョンの管理を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. |