« FTKのDeveloper's Guidを見るが | メイン | メニューWebっぽく »

2005年03月03日

xilion 開発日誌:: バージョンを取得する

    

実行ファイルに埋め込まれたバージョンを取得するには次のようにすると良いよう。

std::vector exebuff(Application->ExeName.WideCharBufSize()+1);
memset( (void*)&exebuff.at(0), 0, exebuff.size()*sizeof(wchar_t) );
Application->ExeName.WideChar( &exebuff.at(0), exebuff.size()*sizeof(wchar_t) );
DWORD n;
n = GetFileVersionInfoSize(&exebuff.at(0), &n);
if( n > 0 )
{
  std::vector buffer(n);
  GetFileVersionInfo(&exebuff.at(0), 0, n, &buffer.at(0));
  unsigned int Len;
  unsigned int cbTranslate;
  wchar_t SubBlock[256];
  wchar_t *pValue;
  struct LANGANDCODEPAGE {
    WORD wLanguage;
    WORD wCodePage;
  } *lpTranslate;
  VerQueryValue(&buffer.at(0), L"\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &cbTranslate);
  swprintf( SubBlock, L"\\StringFileInfo\\%04x%04x\\FileVersion", lpTranslate->wLanguage, lpTranslate->wCodePage);
  if( VerQueryValue(&buffer.at(0), SubBlock, (void**)&pValue, &Len) )
  {
    std::wstring ver(std::wstring(L"Ver. ") + std::wstring(pValue));
    Version->Caption = ver.c_str();
  }
}

C++Builderのヘルプにもサンプルがあったが、そのままだとコンパイルエラーになった。
まあ、型とかポインタがテキトーだったので、見てすぐにダメだろうとは思ったけど。
なお、上記コードは_UNICODEが定義されている時で、コードページは1つだけとみなしている。
また、最初に確保しているバッファは多分2倍になっていると思われる。
ヘルプにAnsiStringがWideCharBufSizeがバイトサイズを返しているかどうか明記されていなかったので、とりあえず文字数と言うことにした。



投稿者 Takenori : 2005年03月03日 04:10




comments powered by Disqus
Total : Today : Yesterday : なかのひと