- #pragma comment(lib, "version.lib")
- DWORD QueryFileInfo(LPTSTR szFullPath)
- {
- DWORD dwErr = ERROR_SUCCESS;
- DWORD dwVerHnd=0; // An 'ignored' parameter, always '0'
- DWORD dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd);
- if (dwVerInfoSize)
- {
- LPBYTE lpVfInfo = new BYTE[dwVerInfoSize];
- ZeroMemory(lpVfInfo, dwVerInfoSize);
- if(GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpVfInfo))
- {
- UINT uVerLen;
- TCHAR dbgStr[1024] = {0};
- //Specifies the root block.
- //The function retrieves a pointer to the VS_FIXEDFILEINFO structure
- // for the version-information resource.
- VS_FIXEDFILEINFO *pFixedVfInfo = 0;
- if(VerQueryValue(lpVfInfo, _T("//"), (LPVOID*)&pFixedVfInfo, &uVerLen))
- {
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwSignature = %08XH/r/n"),
- pFixedVfInfo->dwSignature);
- OutputDebugString(dbgStr);
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwStrucVersion = %X.%X/r/n"),
- HIWORD(pFixedVfInfo->dwStrucVersion), //major version number
- LOWORD(pFixedVfInfo->dwStrucVersion)); //minor version number
- OutputDebugString(dbgStr);
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileVersionMS = %X.%X/r/n"),
- HIWORD(pFixedVfInfo->dwFileVersionMS),
- LOWORD(pFixedVfInfo->dwFileVersionMS));
- OutputDebugString(dbgStr);
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileVersionLS = %X.%X/r/n"),
- HIWORD(pFixedVfInfo->dwFileVersionLS),
- LOWORD(pFixedVfInfo->dwFileVersionLS));
- OutputDebugString(dbgStr);
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwProductVersionMS = %X.%X/r/n"),
- HIWORD(pFixedVfInfo->dwProductVersionMS),
- LOWORD(pFixedVfInfo->dwProductVersionMS));
- OutputDebugString(dbgStr);
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwProductVersionLS = %X.%X/r/n"),
- HIWORD(pFixedVfInfo->dwProductVersionLS),
- LOWORD(pFixedVfInfo->dwProductVersionLS));
- OutputDebugString(dbgStr);
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileFlagsMask = 0x%X/r/n"),
- pFixedVfInfo->dwFileFlagsMask);
- OutputDebugString(dbgStr);
- #define FileFlageCheck(x) { if(pFixedVfInfo->dwFileFlags & (x)) _tcscat(dbgStr, #x" | "); }
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileFlags = 0x%X =>"),
- pFixedVfInfo->dwFileFlagsMask & pFixedVfInfo->dwFileFlags);
- FileFlageCheck(VS_FF_DEBUG);
- FileFlageCheck(VS_FF_PRERELEASE);
- FileFlageCheck(VS_FF_PATCHED);
- FileFlageCheck(VS_FF_PRIVATEBUILD);
- FileFlageCheck(VS_FF_INFOINFERRED);
- FileFlageCheck(VS_FF_SPECIALBUILD);
- _tcscat(dbgStr, _T("/r/n"));
- OutputDebugString(dbgStr);
- #define IsOsVersion(x) { if(pFixedVfInfo->dwFileOS == (x)) _tcscat(dbgStr, #x); }
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileOS = "));
- IsOsVersion(VOS_NT_WINDOWS32);
- IsOsVersion(VOS_OS232_PM32);
- IsOsVersion(VOS_OS216_PM16);
- IsOsVersion(VOS_DOS_WINDOWS32);
- IsOsVersion(VOS_DOS_WINDOWS16);
- IsOsVersion(VOS__WINDOWS32);
- IsOsVersion(VOS__PM32);
- IsOsVersion(VOS__PM16);
- IsOsVersion(VOS__WINDOWS16);
- IsOsVersion(VOS__BASE);
- IsOsVersion(VOS_NT);
- IsOsVersion(VOS_OS232);
- IsOsVersion(VOS_OS216);
- IsOsVersion(VOS_DOS);
- IsOsVersion(VOS_UNKNOWN);
- _tcscat(dbgStr, _T("/r/n"));
- OutputDebugString(dbgStr);
- #define IsFileType(x) { if(pFixedVfInfo->dwFileType == (x)) _tcscat(dbgStr, #x); }
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileType = "));
- IsFileType( VFT_UNKNOWN );
- IsFileType( VFT_APP );
- IsFileType( VFT_DLL );
- IsFileType( VFT_DRV );
- IsFileType( VFT_FONT );
- IsFileType( VFT_VXD );
- IsFileType( VFT_STATIC_LIB );
- _tcscat(dbgStr, _T("/r/n"));
- OutputDebugString(dbgStr);
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileSubtype = "));
- if(pFixedVfInfo->dwFileType == VFT_DRV)
- {
- IsFileType( VFT2_UNKNOWN );
- IsFileType( VFT2_DRV_PRINTER );
- IsFileType( VFT2_DRV_KEYBOARD );
- IsFileType( VFT2_DRV_LANGUAGE );
- IsFileType( VFT2_DRV_DISPLAY );
- IsFileType( VFT2_DRV_MOUSE );
- IsFileType( VFT2_DRV_NETWORK );
- IsFileType( VFT2_DRV_SYSTEM );
- IsFileType( VFT2_DRV_INSTALLABLE );
- IsFileType( VFT2_DRV_SOUND );
- IsFileType( VFT2_DRV_COMM );
- IsFileType( VFT2_DRV_INPUTMETHOD );
- }
- else if(pFixedVfInfo->dwFileType == VFT_FONT)
- {
- IsFileType( VFT2_FONT_RASTER );
- IsFileType( VFT2_FONT_VECTOR );
- IsFileType( VFT2_FONT_TRUETYPE );
- }
- else if(pFixedVfInfo->dwFileType == VFT_VXD )
- {
- _tcscat(dbgStr, _T("virtual device control block"));
- }
- else
- {
- _tcscat(dbgStr, _T("VFT2_UNKNOWN"));
- }
- _tcscat(dbgStr, _T("/r/n"));
- OutputDebugString(dbgStr);
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileDateMS = %d/r/n"),
- pFixedVfInfo->dwFileDateMS);
- OutputDebugString(dbgStr);
- _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileDateLS = %d/r/n"),
- pFixedVfInfo->dwFileDateLS);
- OutputDebugString(dbgStr);
- }
- //first two bytes are language id, and last two bytes are code page
- TCHAR Lang_Charset[10] = {0};
- LPWORD pLangPageCode = 0;
- if(VerQueryValue(lpVfInfo, _T("//VarFileInfo//Translation"), (LPVOID*)&pLangPageCode, &uVerLen))
- {
- _stprintf(Lang_Charset, _T("%04X%04X"), pLangPageCode[0], /*LANG SUBLANG*/ pLangPageCode[1]/*Codepage*/);
- _stprintf(dbgStr, _T("LangPageCode=%s/r/n"), Lang_Charset);
- OutputDebugString(dbgStr);
- }
- //
- LPCTSTR subStrName[] =
- {
- _T("CompanyName"),
- _T("FileDescription"),
- _T("FileVersion"),
- _T("InternalName"),
- _T("LegalCopyright"),
- _T("OriginalFileName"),
- _T("ProductName"),
- _T("ProductVersion"),
- };
- for(int i=0; i<sizeof(subStrName)/sizeof(subStrName[0]); i++)
- {
- TCHAR szsubBlock[256] = {0}; ///StringFileInfo/lang-codepage/string-name
- _stprintf(szsubBlock, _T("//StringFileInfo//%s//%s"), Lang_Charset, subStrName[i]);
- //The function retrieves a string value specific to the language and code page indicated.
- LPTSTR lpszInfo = NULL;
- if(VerQueryValue(lpVfInfo, szsubBlock, (LPVOID*)&lpszInfo, &uVerLen))
- {
- _stprintf(dbgStr, _T("%s->%s/r/n"),subStrName[i], lpszInfo);
- OutputDebugString(dbgStr);
- }
- }
- }
- else
- {
- dwErr = GetLastError();
- }
- delete []lpVfInfo;
- }
- else //GetFileVersionInfoSize Error;
- {
- dwErr = GetLastError();
- }
- return dwErr;
- }
获得文件版本等信息
最新推荐文章于 2024-10-10 23:37:15 发布