從檔案資源擷取檔案資訊

來源:互聯網
上載者:User

#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 />

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.