::GetFileVersionInfo
以前から使用している FileVer.?xx が MFC に依存しているので,その書き直し.
Win8 の頃だったと思うが,OS のバージョンの取得方法が面倒になった.
システム バージョンの取得
オペレーティング システムのバージョン
欲しいのは動作 OS のバージョン文字列なので WinVer.exe などから取得する様にしていた.
で,書き換えようと思って調べていると…
exe のプロパティで表示されるファイルバージョンと異なることに気付いた.
::GetFileVersionInfo で取得すると次の文字列が返ってくる.
10.0.19041.1826 (WinBuild.160101.0800)
次の様なコードを書いて ::GetFileVersionInfo で返されるものをダンプ.
{
DWORD VerHandle = 0 ;
DWORD VerInfoSize = 0 ;
v_char VerData ;
VerInfoSize = ::GetFileVersionInfoSize(LPTSTR(file.c_str()),&VerHandle) ;
VerData.resize(VerInfoSize*2) ;
if (::GetFileVersionInfo(LPTSTR(file.c_str()),VerHandle,VerInfoSize,&VerData[0])) {
tstring tmp_path = ::Get_i_Tools_tmp_date() ;
tstring tmp_name = ::Path_AddLastSP(tmp_path) + ::Path_GetName(file) + _T(".dmp") ;
::v_c_Save(tmp_name.c_str(),VerData) ;
}
}
ファイルバージョンの取得.
{
/*
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,53,2022,1
PRODUCTVERSION 1,53,2022,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041104b0"
BEGIN
VALUE "Comments", "\0"
VALUE "CompanyName", "\0"
VALUE "FileDescription", "3D Viewer\0"
VALUE "FileVersion", "1, 53, 2022, 1\0"
VALUE "InternalName", "i3DV\0"
VALUE "LegalCopyright", "Copyright (C) 2013-2022 I. Nakagawa\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "i3DV.exe\0"
VALUE "PrivateBuild", "\0"
VALUE "ProductName", "i_Tools\0"
VALUE "ProductVersion", "1, 53, 2022, 1\0"
VALUE "SpecialBuild", "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x411, 1200
END
END
*/
tstring StringFileInfo ;
{
struct LANGANDCODEPAGE {
WORD wLanguage ; // 0x411
WORD wCodePage ; // 1200 0x4b0
} *lpTranslate = NULL ;
UINT lenT = 0 ;
if (::VerQueryValue(&VerData[0],_T("\\VarFileInfo\\Translation"),(void**)&lpTranslate,&lenT)) {
tstring lang_cp_str = ::u32to0t(lpTranslate->wLanguage,16,4) +
::u32to0t(lpTranslate->wCodePage,16,4) ; // "041104b0"
StringFileInfo = _T("\\StringFileInfo\\") + lang_cp_str + _T("\\") ;
}
}
{
UINT lenFV = 0 ;
TCHAR* lpFV = NULL ;
tstring name = _T("FileVersion") ;
if (::VerQueryValue(&VerData[0],LPTSTR((StringFileInfo+name).c_str()),(void**)&lpFV,&lenFV)) {
std::terr << lpFV << std::endl ;
}
}
}