ホーム » Windows » ::GetFileVersionInfo

2022年7月
 12
3456789
10111213141516
17181920212223
24252627282930
31  

カテゴリー

アーカイブ

ブログ統計情報

  • 80,379 アクセス



::GetFileVersionInfo

以前から使用している FileVer.?xx が MFC に依存しているので,その書き直し.


Win8 の頃だったと思うが,OS のバージョンの取得方法が面倒になった.
システム バージョンの取得
オペレーティング システムのバージョン
欲しいのは動作 OS のバージョン文字列なので WinVer.exe などから取得する様にしていた.


で,書き換えようと思って調べていると…
exe のプロパティで表示されるファイルバージョンと異なることに気付いた.
where.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) ;
		}
	}

::GetFileVersionInfo で返されるデータのダンプ


ファイルバージョンの取得.

{
	/*
		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 ;
			}
		}
	}

FVersion.hxx

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

3件のコメント

コメントは停止中です。

%d人のブロガーが「いいね」をつけました。