2009-03-03 12 views

答えて

6

は、標準のWindows API関数を使用して、それを行うのC++の方法です:

try 
{ 
    TCHAR szFileName[ MAX_PATH ]; 
    if(!::GetModuleFileName(0, szFileName, MAX_PATH)) 
     throw __LINE__; 

    DWORD nParam; 
    DWORD nVersionSize = ::GetFileVersionInfoSize(szFileName, &nParam); 
    if(!nVersionSize) 
     throw __LINE__; 

    HANDLE hMem = ::GetProcessHeap(); 
    if(!hMem) 
     throw __LINE__; 

    LPVOID lpVersionData = ::HeapAlloc(hMem, 0, nVersionSize); 
    if(!lpVersionData) 
     throw __LINE__; 

    if(!::GetFileVersionInfo(szFileName, 0, nVersionSize, lpVersionData)) 
     throw __LINE__; 

    LPVOID pVersionInfo; 
    UINT nSize; 
    if(!::VerQueryValue(lpVersionData, _T("\\"), &pVersionInfo, &nSize)) 
     throw __LINE__; 

    VS_FIXEDFILEINFO *pVSInfo = (VS_FIXEDFILEINFO *)pVersionInfo; 
    CString strVersion; 
    strVersion.Format(_T(" version %i.%i.%i.%i"), 
     pVSInfo->dwProductVersionMS >> 16, 
     pVSInfo->dwProductVersionMS & 0xFFFF, 
     pVSInfo->dwProductVersionLS >> 16, 
     pVSInfo->dwProductVersionLS & 0xFFFF 
     ); 
    GetDlgItem(IDC_ABOUT_VERSION)->SetWindowText(strAppName + strVersion); 

    if(!HeapFree(hMem, 0, lpVersionData)) 
     throw __LINE__; 
} 
catch(int err) 
{ 
    ASSERT(!err); // always break on debug builds to inspect error codes and such 

    DWORD dwErr = ::GetLastError(); 

    // handle memory cleanup... 
} 

キャッチ部分は純粋に教育的であること - あなたが希望実際の状況に適切にクリーンアップメモリ​​割り当ての後実際にはエラーコードを使用してください!

+0

:: HeapAllocの呼び出し後にスローがあると、メモリがリークします。 – plinth

2

バレンタインの答えは正しいですが、メモリリークの可能性についてのコメント投稿者の台座の警告です。

なぜこの日と年齢で:: HeapAllocを使用するのかわかりません。

ここでは、IMHOがより安全でクリーンな方法で同じことをするために新しいとboost :: shared_arrayを使用するスニペットを示します。ここで

#include <boost/shared_array.hpp> 

//..... 

DWORD dwHandle; 
DWORD dwFileVersionInfoSize = GetFileVersionInfoSize((LPTSTR)lpszFileName, &dwHandle); 

if (!dwFileVersionInfoSize) 
     return FALSE; 

// ensure our data will be deleted 
boost::shared_array<BYTE> data(new BYTE[dwFileVersionInfoSize]); 
LPVOID const lpData = data.get(); 

//party on with lpData.... 
2

は、Delphi 7バージョンです:.NETアセンブリを確認するには

uses Windows, SysUtils; 

function GetEXEVersion(exename: string; const Fmt : string = '%d.%d.%d.%d'): string; 
{ 
    credit to [email protected] 
    (http://martinstoeckli.ch/delphi/delphi.html#AppVersion) 
} 
var 
    iBufferSize, iDummy : dword; 
    pBuffer, pFileInfo : Pointer; 
    iVer : array[1..4] of word; 
begin 
    Result := ''; 
    iBufferSize := GetFileVersionInfoSize(PChar(exename), iDummy); 
    if iBufferSize > 0 then begin 
    GetMem(pBuffer, iBufferSize); 
    try 
     GetFileVersionInfo(PChar(exename), 0, iBufferSize, pBuffer); 
     VerQueryValue(pBuffer, '\', pFileInfo, iDummy); 
     iVer[1] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS); 
     iVer[2] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS); 
     iVer[3] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS); 
     iVer[4] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS); 
     finally FreeMem(pBuffer); 
    end; 
    Result := Format(Fmt, [iVer[1],iVer[2],iVer[3],iVer[4]]); 
    end; 
end; 
1

、C#で:

System.Reflection.Assembly.LoadFile(@ "C:\ WindowsはMicrosoftを\します。 NET \ Framework \ v2.0.50727 \ system.data.dll ")。GetName()。Version.ToString();

関連する問題