プログラムのバージョン番号を取得して表示したい場合などがあります。
以下のような感じで関数化して使っています。
//--------------------------------------------------------------------------- // ファイルのバージョン番号を文字列で返す // 引 数: strPATH ---- バージョンを返したいファイルへのパス // ファイルが指定されなかった場合は自分自身 // 戻り値: バージョン番号文字列 // Written by Shue //--------------------------------------------------------------------------- AnsiString __fastcall subGetVersion(AnsiString strPATH) { DWORD *dwHDL, dwSIZE, dwTMP; unsigned int iSIZE; char *cBUF, bBUF[MAX_PATH]; AnsiString strRET = ""; VS_FIXEDFILEINFO vsfDAT; int i1, i2, i3, i4; try { // パスのチェック if (strPATH.Trim().IsEmpty() || (!FileExists(strPATH))) { // 自分自身のパスを求める ::GetModuleFileName(::GetModuleHandle(NULL), bBUF, MAX_PATH); strPATH = AnsiString(bBUF); } // バージョン情報のサイズを取得 dwSIZE = ::GetFileVersionInfoSize(strPATH.c_str(), &dwTMP); if (dwSIZE > 0) { // バージョン情報を求める cBUF = (char*)malloc(dwSIZE + 2); if (cBUF != NULL) { if (::GetFileVersionInfo(strPATH.c_str(), NULL, dwSIZE, cBUF)) { // バージョン情報を変換 dwHDL = NULL; iSIZE = 0; if (::VerQueryValue(cBUF, "\\", (void**)&dwHDL, &iSIZE)) { // バージョン文字列を生成 ::CopyMemory(&vsfDAT, dwHDL, iSIZE); i1 = vsfDAT.dwFileVersionMS; i2 = vsfDAT.dwFileVersionMS; i3 = vsfDAT.dwFileVersionLS; i4 = vsfDAT.dwFileVersionLS; i1 = (i1 >> 16) & 0xffff; i2 = i2 & 0xffff; i3 = (i3 >> 16) & 0xffff; i4 = i4 & 0xffff; strRET = AnsiString(i1) + "." + AnsiString(i2) + "."; strRET += AnsiString(i3) + "." + AnsiString(i4); } } free(cBUF); } } } catch(...) { return ""; } return strRET; }