从文件资源获取文件信息

#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;
}

//测试代码
  TCHAR szFile[MAX_PATH+1] = {0};
  GetModuleFileName(NULL, szFile, MAX_PATH);
  QueryFileInfo(szFile);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值