2009-03-03 60 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 2009-03-03 15:26:47

2

Valentin的回答是正確的,但請注意評論者對可能發生內存泄漏的警告。

我也不確定你爲什麼要在這個時代使用:: HeapAlloc。

這裏是一個片段,它使用new和boost :: shared_array在IMHO中做同樣的事情是一種更安全和更清潔的方式。

#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版本:

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

要檢查.NET程序集,在C#:

System.Reflection.Assembly.LoadFile(@「C:\ WINDOWS \微軟。 NET \框架\ V2.0.50727 \ system.data.dll中「)的GetName()Version.ToString()。