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