2009年10月20日

[C++]AboutBoxにリソースからバージョンを取得して表示

MFC AppWizardで生成したAboutBoxに動的にVersionリソースから取得した情報を表示するのは結構面倒。ここではIDC_VERというIDのSTATICコントロールにセットする場合の例。AboutBoxにCDiglog::OnInitDialog()をオーバーライドすべし。version.libライブラリも必要なのでLINKする。ここでは#pragma指定。

ver.jpg

verres.jpg

#pragma comment(lib,"version.lib")
BOOL CAboutDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
 

    // 現在の実行モジュールのフル・パスを取得
    char szModuleName[_MAX_PATH + 1];
    int nRet = ::GetModuleFileName( NULL, szModuleName, _MAX_PATH );

	DWORD dwSize = 0;
    DWORD dwReserved;
	dwSize = ::GetFileVersionInfoSize( szModuleName, &dwReserved );

	// ファイルのバージョン情報を取得
	char *pBuf=new char[dwSize+1];
	BOOL bRet = ::GetFileVersionInfo( szModuleName, 0, dwSize, pBuf );


	//charset変換テーブルを取得
	LPWORD  lpWord;
	UINT  dwLen;
	bRet = ::VerQueryValue( pBuf, "\\VarFileInfo\\Translation", (void **)&lpWord, &dwLen );
	if( bRet ) {
		
        // lpWord[0] は言語セット lpWord[1] はキャラクタセット
        DWORD dwLangAndCharSet = MAKELONG( lpWord[1], lpWord[0] );
		
		//version
		char szKey[255];
 		LPSTR  lpStr;
		sprintf( szKey, "\\StringFileInfo\\%08x\\%s", dwLangAndCharSet, "FileVersion" );
		bRet = ::VerQueryValue( pBuf, szKey,  (void **)&lpStr, &dwLen );
		if( bRet ) {
		   SetDlgItemText(IDC_VER,lpStr);
		}
    }
    delete pBuf;
    return TRUE; 
}
※EXEから利用されたDLL内のバージョンリソースを取得する場合は、DLL内で上記GetModuleFileName()するとき、第1パラメータのNULLをAfxGetApp()->m_hInstance にすればよい。
posted by エコ猫 at 21:42| Comment(1) | C++/MFC | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
気になるジャンルだったので、コメだけ残していきます。

ブログ更新がんばってください。
今後いろいろ参考にさせていただくかもしれません。
応援してます。
Posted by 全角カタカナ at 2009年11月07日 12:01
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: