获得文件版本等信息

  1. #pragma comment(lib, "version.lib")   
  2. DWORD QueryFileInfo(LPTSTR szFullPath)   
  3. {   
  4.   DWORD dwErr = ERROR_SUCCESS;   
  5.   
  6.   DWORD dwVerHnd=0;        // An 'ignored' parameter, always '0'   
  7.   DWORD dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd);   
  8.   if (dwVerInfoSize)    
  9.   {   
  10.     LPBYTE lpVfInfo = new BYTE[dwVerInfoSize];   
  11.     ZeroMemory(lpVfInfo, dwVerInfoSize);   
  12.     if(GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpVfInfo))   
  13.     {   
  14.       UINT uVerLen;   
  15.       TCHAR dbgStr[1024] = {0};   
  16.   
  17.       //Specifies the root block.   
  18.       //The function retrieves a pointer to the VS_FIXEDFILEINFO structure   
  19.       // for the version-information resource.   
  20.       VS_FIXEDFILEINFO *pFixedVfInfo = 0;   
  21.       if(VerQueryValue(lpVfInfo, _T("//"), (LPVOID*)&pFixedVfInfo, &uVerLen))   
  22.       {          
  23.   
  24.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwSignature = %08XH/r/n"),    
  25.           pFixedVfInfo->dwSignature);   
  26.         OutputDebugString(dbgStr);   
  27.   
  28.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwStrucVersion = %X.%X/r/n"),    
  29.           HIWORD(pFixedVfInfo->dwStrucVersion), //major version number   
  30.           LOWORD(pFixedVfInfo->dwStrucVersion)); //minor version number   
  31.         OutputDebugString(dbgStr);   
  32.   
  33.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileVersionMS = %X.%X/r/n"),   
  34.           HIWORD(pFixedVfInfo->dwFileVersionMS),   
  35.           LOWORD(pFixedVfInfo->dwFileVersionMS));   
  36.         OutputDebugString(dbgStr);   
  37.   
  38.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileVersionLS = %X.%X/r/n"),   
  39.           HIWORD(pFixedVfInfo->dwFileVersionLS),   
  40.           LOWORD(pFixedVfInfo->dwFileVersionLS));   
  41.         OutputDebugString(dbgStr);   
  42.   
  43.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwProductVersionMS = %X.%X/r/n"),   
  44.           HIWORD(pFixedVfInfo->dwProductVersionMS),   
  45.           LOWORD(pFixedVfInfo->dwProductVersionMS));   
  46.         OutputDebugString(dbgStr);   
  47.   
  48.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwProductVersionLS = %X.%X/r/n"),   
  49.           HIWORD(pFixedVfInfo->dwProductVersionLS),   
  50.           LOWORD(pFixedVfInfo->dwProductVersionLS));   
  51.         OutputDebugString(dbgStr);   
  52.   
  53.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileFlagsMask = 0x%X/r/n"),   
  54.           pFixedVfInfo->dwFileFlagsMask);   
  55.         OutputDebugString(dbgStr);   
  56.   
  57.         #define FileFlageCheck(x) { if(pFixedVfInfo->dwFileFlags & (x)) _tcscat(dbgStr, #x" | "); }   
  58.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileFlags = 0x%X =>"),   
  59.           pFixedVfInfo->dwFileFlagsMask & pFixedVfInfo->dwFileFlags);   
  60.         FileFlageCheck(VS_FF_DEBUG);   
  61.         FileFlageCheck(VS_FF_PRERELEASE);   
  62.         FileFlageCheck(VS_FF_PATCHED);   
  63.         FileFlageCheck(VS_FF_PRIVATEBUILD);   
  64.         FileFlageCheck(VS_FF_INFOINFERRED);   
  65.         FileFlageCheck(VS_FF_SPECIALBUILD);   
  66.         _tcscat(dbgStr, _T("/r/n"));   
  67.         OutputDebugString(dbgStr);   
  68.   
  69.         #define IsOsVersion(x) { if(pFixedVfInfo->dwFileOS == (x)) _tcscat(dbgStr, #x); }   
  70.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileOS = "));   
  71.         IsOsVersion(VOS_NT_WINDOWS32);   
  72.         IsOsVersion(VOS_OS232_PM32);   
  73.         IsOsVersion(VOS_OS216_PM16);   
  74.         IsOsVersion(VOS_DOS_WINDOWS32);   
  75.         IsOsVersion(VOS_DOS_WINDOWS16);   
  76.         IsOsVersion(VOS__WINDOWS32);   
  77.         IsOsVersion(VOS__PM32);   
  78.         IsOsVersion(VOS__PM16);   
  79.         IsOsVersion(VOS__WINDOWS16);   
  80.         IsOsVersion(VOS__BASE);   
  81.         IsOsVersion(VOS_NT);   
  82.         IsOsVersion(VOS_OS232);   
  83.         IsOsVersion(VOS_OS216);   
  84.         IsOsVersion(VOS_DOS);   
  85.         IsOsVersion(VOS_UNKNOWN);   
  86.         _tcscat(dbgStr, _T("/r/n"));   
  87.         OutputDebugString(dbgStr);   
  88.   
  89.         #define IsFileType(x) { if(pFixedVfInfo->dwFileType == (x)) _tcscat(dbgStr, #x); }   
  90.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileType = "));   
  91.         IsFileType( VFT_UNKNOWN );   
  92.         IsFileType( VFT_APP );   
  93.         IsFileType( VFT_DLL );   
  94.         IsFileType( VFT_DRV );   
  95.         IsFileType( VFT_FONT );   
  96.         IsFileType( VFT_VXD );   
  97.         IsFileType( VFT_STATIC_LIB );   
  98.         _tcscat(dbgStr, _T("/r/n"));   
  99.         OutputDebugString(dbgStr);   
  100.   
  101.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileSubtype = "));   
  102.         if(pFixedVfInfo->dwFileType == VFT_DRV)   
  103.         {   
  104.           IsFileType( VFT2_UNKNOWN );   
  105.           IsFileType( VFT2_DRV_PRINTER );   
  106.           IsFileType( VFT2_DRV_KEYBOARD );   
  107.           IsFileType( VFT2_DRV_LANGUAGE );   
  108.           IsFileType( VFT2_DRV_DISPLAY );   
  109.           IsFileType( VFT2_DRV_MOUSE );   
  110.           IsFileType( VFT2_DRV_NETWORK );   
  111.           IsFileType( VFT2_DRV_SYSTEM );   
  112.           IsFileType( VFT2_DRV_INSTALLABLE );   
  113.           IsFileType( VFT2_DRV_SOUND );   
  114.           IsFileType( VFT2_DRV_COMM );   
  115.           IsFileType( VFT2_DRV_INPUTMETHOD );   
  116.         }   
  117.         else if(pFixedVfInfo->dwFileType == VFT_FONT)   
  118.         {   
  119.           IsFileType(  VFT2_FONT_RASTER );   
  120.           IsFileType(  VFT2_FONT_VECTOR );   
  121.           IsFileType(  VFT2_FONT_TRUETYPE );             
  122.         }   
  123.         else if(pFixedVfInfo->dwFileType == VFT_VXD )   
  124.         {   
  125.           _tcscat(dbgStr, _T("virtual device control block"));             
  126.         }   
  127.         else  
  128.         {   
  129.           _tcscat(dbgStr, _T("VFT2_UNKNOWN"));   
  130.         }   
  131.         _tcscat(dbgStr, _T("/r/n"));   
  132.         OutputDebugString(dbgStr);   
  133.   
  134.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileDateMS = %d/r/n"),    
  135.           pFixedVfInfo->dwFileDateMS);   
  136.         OutputDebugString(dbgStr);   
  137.   
  138.         _stprintf(dbgStr, _T("VS_FIXEDFILEINFO.dwFileDateLS = %d/r/n"),    
  139.           pFixedVfInfo->dwFileDateLS);   
  140.         OutputDebugString(dbgStr);        
  141.       }   
  142.   
  143.       //first two bytes are language id, and last two bytes are code page   
  144.       TCHAR Lang_Charset[10] = {0};   
  145.       LPWORD pLangPageCode = 0;   
  146.       if(VerQueryValue(lpVfInfo, _T("//VarFileInfo//Translation"), (LPVOID*)&pLangPageCode, &uVerLen))   
  147.       {   
  148.         _stprintf(Lang_Charset, _T("%04X%04X"), pLangPageCode[0], /*LANG SUBLANG*/ pLangPageCode[1]/*Codepage*/);   
  149.   
  150.   
  151.         _stprintf(dbgStr, _T("LangPageCode=%s/r/n"), Lang_Charset);   
  152.         OutputDebugString(dbgStr);        
  153.       }   
  154.   
  155.       //   
  156.       LPCTSTR subStrName[] =   
  157.       {   
  158.         _T("CompanyName"),   
  159.         _T("FileDescription"),   
  160.         _T("FileVersion"),   
  161.         _T("InternalName"),   
  162.         _T("LegalCopyright"),   
  163.         _T("OriginalFileName"),   
  164.         _T("ProductName"),   
  165.         _T("ProductVersion"),   
  166.       };   
  167.       for(int i=0; i<sizeof(subStrName)/sizeof(subStrName[0]); i++)   
  168.       {   
  169.         TCHAR szsubBlock[256] = {0}; ///StringFileInfo/lang-codepage/string-name   
  170.         _stprintf(szsubBlock, _T("//StringFileInfo//%s//%s"), Lang_Charset, subStrName[i]);   
  171.   
  172.         //The function retrieves a string value specific to the language and code page indicated.    
  173.         LPTSTR lpszInfo = NULL;   
  174.         if(VerQueryValue(lpVfInfo, szsubBlock, (LPVOID*)&lpszInfo, &uVerLen))   
  175.         {   
  176.           _stprintf(dbgStr, _T("%s->%s/r/n"),subStrName[i], lpszInfo);   
  177.           OutputDebugString(dbgStr);    
  178.         }           
  179.       }   
  180.     }   
  181.     else  
  182.     {   
  183.       dwErr = GetLastError();         
  184.     }   
  185.     delete []lpVfInfo;   
  186.   }    
  187.   else //GetFileVersionInfoSize Error;   
  188.   {   
  189.     dwErr = GetLastError();   
  190.   }   
  191.   return dwErr;   
  192. }  

你可能感兴趣的:(获得文件版本等信息)