バージョン情報の情報を取得する

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