源码实现:
#pragma comment(lib,"Version.lib")
typedef struct _VS_VERSIONINFO {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding1[];
VS_FIXEDFILEINFO Value;
WORD Padding2[];
WORD Children[];
}VS_VERSIONINFO;
CString GetFileVersion(CString strFilePath)
{
CString strRet = _T("");
VS_VERSIONINFO *pVerInfo = NULL;
LPBYTE pOffsetBytes = NULL;
VS_FIXEDFILEINFO *pFixedInfo = NULL;
DWORD dwHandle=0,dwSize=0;
dwSize = ::GetFileVersionInfoSize((LPTSTR)(LPCTSTR)strFilePath, &dwHandle);
if (0 < dwSize)
{
LPBYTE lpBuffer = new BYTE[dwSize];
::memset(lpBuffer,0,sizeof(dwSize));
if (GetFileVersionInfo((LPTSTR)(LPCTSTR)strFilePath, 0, dwSize, lpBuffer) != FALSE)
{
#define roundoffs(a,b,r) (((BYTE *) (b) - (BYTE *) (a) + ((r) - 1)) & ~((r) - 1))
#define roundpos(a,b,r) (((BYTE *) (a)) + roundoffs(a,b,r))
pVerInfo = (VS_VERSIONINFO *) lpBuffer;
pOffsetBytes = (BYTE *) &pVerInfo->szKey[wcslen(pVerInfo->szKey) + 1];
pFixedInfo = (VS_FIXEDFILEINFO *) roundpos(pVerInfo, pOffsetBytes, 4);
DWORD version = pFixedInfo->dwFileVersionMS;
DWORD version2 = pFixedInfo->dwFileVersionLS;
WORD a = HIWORD(version);
WORD b = LOWORD(version);
WORD c = HIWORD(version2);
WORD d = LOWORD(version2);
strRet.Format("%d.%d.%d.%d",a,b,c,d);
}
SAFE_DELETE_ARRAY(lpBuffer);
}
return strRet;
}