#include <WinVer.h>
#pragma comment(lib, "Version.lib")
static HRESULT GetFixedFileVersionInfo(LPCTSTR szFileName, VS_FIXEDFILEINFO* pVal)
{
if (pVal == NULL)
{
return E_POINTER;
}
DWORD dwHandle = NULL;
DWORD dwBlockSize = ::GetFileVersionInfoSize((LPSTR)szFileName, &dwHandle);
if (dwBlockSize == 0)
{
DWORD dwError = ::GetLastError();
return HRESULT_FROM_WIN32(dwError);
}
BYTE* pBlock = new BYTE[dwBlockSize];
BOOL br = ::GetFileVersionInfo((LPSTR)szFileName, dwHandle, dwBlockSize, pBlock);
if (!br)
{
DWORD dwError = ::GetLastError();
return HRESULT_FROM_WIN32(dwError);
}
void* pSubBlock = NULL;
UINT nSubBlockSize = 0;
br = ::VerQueryValue(pBlock, _T("\\"), &pSubBlock, &nSubBlockSize);
if (!br)
{
DWORD dwError = ::GetLastError();
return HRESULT_FROM_WIN32(dwError);
}
memcpy(pVal, pSubBlock, sizeof(VS_FIXEDFILEINFO));
delete[] pBlock;
return S_OK;
}
static CString GetVersionString(DWORD dwVersionMS, DWORD dwVersionLS)
{
CString strResult;
strResult.Format(_T("%d.%d.%d.%d"), HIWORD(dwVersionMS), LOWORD(dwVersionMS), HIWORD(dwVersionLS), LOWORD(dwVersionLS));
return strResult;
}