//
pName _T("CompanyName"),_T("FileDescription"),_T("FileVersion"),
// _T("InternalName"),_T("LegalCopyright"),_T("OriginalFilename"),
// _T("ProductName"),_T("ProductVersion"),
BOOL GetFileVersionString(CHAR * pFileName, _bstr_t * pRecvStr, TCHAR * pName /**/ /* = NULL */ )
... {
DWORD dwDummyHandle; // will always be set to zero
DWORD dwLen;
BYTE * pVersionInfo;
BOOL bRetVal;
VS_FIXEDFILEINFO FileVersion;
*pRecvStr = "Error";
struct TRANSLATION ...{
WORD langID; // language ID
WORD charset; // character set (code page)
} Translation;
HMODULE hVerDll;
hVerDll = LoadLibrary(_T("VERSION.dll"));
if(hVerDll == NULL)
return FALSE;
typedef DWORD (WINAPI *Fun_GetFileVersionInfoSizeA)(CHAR *, DWORD *);
typedef BOOL (WINAPI *Fun_GetFileVersionInfoA)(CHAR *, DWORD, DWORD, LPVOID);
typedef BOOL (WINAPI *Fun_VerQueryValueA)(LPVOID, CHAR *, LPVOID, PUINT);
Fun_GetFileVersionInfoSizeA pGetFileVersionInfoSizeA;
Fun_GetFileVersionInfoA pGetFileVersionInfoA;
Fun_VerQueryValueA pVerQueryValueA;
pGetFileVersionInfoSizeA = (Fun_GetFileVersionInfoSizeA)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeA");
pGetFileVersionInfoA = (Fun_GetFileVersionInfoA)::GetProcAddress(hVerDll, "GetFileVersionInfoA");
pVerQueryValueA = (Fun_VerQueryValueA)::GetProcAddress(hVerDll, "VerQueryValueA");
Translation.charset = 1252; // default = ANSI code page
dwLen = pGetFileVersionInfoSizeA(pFileName, &dwDummyHandle);
if (dwLen == 0)
return FALSE;
pVersionInfo = new BYTE[dwLen]; // allocate version info
bRetVal = pGetFileVersionInfoA(pFileName, 0, dwLen, pVersionInfo);
if(bRetVal == FALSE)
...{
delete [] pVersionInfo;
return FALSE;
}
VOID * pVI;
UINT uLen;
bRetVal = pVerQueryValueA(pVersionInfo, "/", &pVI, &uLen);
if(bRetVal == FALSE)
...{
delete [] pVersionInfo;
return FALSE;
}
memcpy(&FileVersion, pVI, sizeof(VS_FIXEDFILEINFO));
bRetVal = pVerQueryValueA(pVersionInfo, "/VarFileInfo/Translation",
&pVI, &uLen);
if(bRetVal && uLen >= 4)
...{
memcpy(&Translation, pVI, sizeof(TRANSLATION));
}
BREAKIF(FileVersion.dwSignature != VS_FFI_SIGNATURE);
CHAR szQuery[1024];
CHAR * pVal;
UINT iLenVal;
if(pName == NULL)
...{
sprintf(szQuery, "%d.%d.%d.%d",
HIWORD(FileVersion.dwFileVersionMS), LOWORD(FileVersion.dwFileVersionMS),
HIWORD(FileVersion.dwFileVersionLS), LOWORD(FileVersion.dwFileVersionLS));
*pRecvStr = szQuery;
}
else
...{
_bstr_t bStrName = pName;
sprintf(szQuery, "/StringFileInfo/%04x%04x/%s",
Translation.langID, Translation.charset, (CHAR *)bStrName);
bRetVal = pVerQueryValueA(pVersionInfo, szQuery, (LPVOID*)&pVal, &iLenVal);
*pRecvStr = pVal;
}
delete [] pVersionInfo;
return TRUE;
}
// _T("InternalName"),_T("LegalCopyright"),_T("OriginalFilename"),
// _T("ProductName"),_T("ProductVersion"),
BOOL GetFileVersionString(CHAR * pFileName, _bstr_t * pRecvStr, TCHAR * pName /**/ /* = NULL */ )
... {
DWORD dwDummyHandle; // will always be set to zero
DWORD dwLen;
BYTE * pVersionInfo;
BOOL bRetVal;
VS_FIXEDFILEINFO FileVersion;
*pRecvStr = "Error";
struct TRANSLATION ...{
WORD langID; // language ID
WORD charset; // character set (code page)
} Translation;
HMODULE hVerDll;
hVerDll = LoadLibrary(_T("VERSION.dll"));
if(hVerDll == NULL)
return FALSE;
typedef DWORD (WINAPI *Fun_GetFileVersionInfoSizeA)(CHAR *, DWORD *);
typedef BOOL (WINAPI *Fun_GetFileVersionInfoA)(CHAR *, DWORD, DWORD, LPVOID);
typedef BOOL (WINAPI *Fun_VerQueryValueA)(LPVOID, CHAR *, LPVOID, PUINT);
Fun_GetFileVersionInfoSizeA pGetFileVersionInfoSizeA;
Fun_GetFileVersionInfoA pGetFileVersionInfoA;
Fun_VerQueryValueA pVerQueryValueA;
pGetFileVersionInfoSizeA = (Fun_GetFileVersionInfoSizeA)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeA");
pGetFileVersionInfoA = (Fun_GetFileVersionInfoA)::GetProcAddress(hVerDll, "GetFileVersionInfoA");
pVerQueryValueA = (Fun_VerQueryValueA)::GetProcAddress(hVerDll, "VerQueryValueA");
Translation.charset = 1252; // default = ANSI code page
dwLen = pGetFileVersionInfoSizeA(pFileName, &dwDummyHandle);
if (dwLen == 0)
return FALSE;
pVersionInfo = new BYTE[dwLen]; // allocate version info
bRetVal = pGetFileVersionInfoA(pFileName, 0, dwLen, pVersionInfo);
if(bRetVal == FALSE)
...{
delete [] pVersionInfo;
return FALSE;
}
VOID * pVI;
UINT uLen;
bRetVal = pVerQueryValueA(pVersionInfo, "/", &pVI, &uLen);
if(bRetVal == FALSE)
...{
delete [] pVersionInfo;
return FALSE;
}
memcpy(&FileVersion, pVI, sizeof(VS_FIXEDFILEINFO));
bRetVal = pVerQueryValueA(pVersionInfo, "/VarFileInfo/Translation",
&pVI, &uLen);
if(bRetVal && uLen >= 4)
...{
memcpy(&Translation, pVI, sizeof(TRANSLATION));
}
BREAKIF(FileVersion.dwSignature != VS_FFI_SIGNATURE);
CHAR szQuery[1024];
CHAR * pVal;
UINT iLenVal;
if(pName == NULL)
...{
sprintf(szQuery, "%d.%d.%d.%d",
HIWORD(FileVersion.dwFileVersionMS), LOWORD(FileVersion.dwFileVersionMS),
HIWORD(FileVersion.dwFileVersionLS), LOWORD(FileVersion.dwFileVersionLS));
*pRecvStr = szQuery;
}
else
...{
_bstr_t bStrName = pName;
sprintf(szQuery, "/StringFileInfo/%04x%04x/%s",
Translation.langID, Translation.charset, (CHAR *)bStrName);
bRetVal = pVerQueryValueA(pVersionInfo, szQuery, (LPVOID*)&pVal, &iLenVal);
*pRecvStr = pVal;
}
delete [] pVersionInfo;
return TRUE;
}