« FTKのDeveloper's Guidを見るが | メイン | メニューWebっぽく »
2005年03月03日
xilion 開発日誌:: バージョンを取得する
Tweet @jin1016をフォロー実行ファイルに埋め込まれたバージョンを取得するには次のようにすると良いよう。
std::vector
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
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