通过 GetFileVersionInfo 获取EXE 或 DLL的各种资源

查找网上资源甚多,但无一个代码能用,甚憾。自已阅读MSDN资料,终于写得下面代码,经测试通过,若有问题请发邮件给我,谢谢!

struct LANGANDCODEPAGE
{
  WORD wLanguage;
  WORD wCodePage;
} *lpTranslate;

void GetInfoFromExeAndDll(PCTSTR pcszFileName)
{
 DWORD dwSize = 0;
 UINT uiSize = GetFileVersionInfoSize(pcszFileName,&dwSize);
 
 if (0 == uiSize)
 {
  //0 意味着GetFileVersionInfoSize 函数调用失败
  return;
 }

 PTSTR pBuffer = new TCHAR[uiSize];
 
 if (NULL == pBuffer)
 {
  //分配内存失败:)
  return ;
 }

 memset((void*)pBuffer,0,uiSize);

 //获取exe 或 DLL 的资源信息,存放在pBuffer内
 if(!GetFileVersionInfo(pcszFileName,0,uiSize,(PVOID)pBuffer))
 {
  //GetFileVersionInfo 调用失败.
  return ;
 }


 LANGANDCODEPAGE *pLanguage = NULL;  //这里这样设置没关系了。

 UINT  uiOtherSize = 0;
 //获取资源相关的 codepage 和language
 if (!VerQueryValue(pBuffer,_T("//VarFileInfo//Translation"),
    (PVOID*)&pLanguage,&uiOtherSize))
 {
  //出错
  return;
 }
 
 //
 //
 //超级重点

 PVOID pTmp = NULL;   //一定要把pTmp这个变量设置成PVOID或LPVOID型的
        //否则无法获取信息。你不信可以试。
 //TCHAR *pTmp = NULL;
 //或下面这样的设置
 //TCHAR pTmp[MAX_PATH];
 //memset((void*)pTmp,0,sizeof(pTmp));


 //
 //

 TCHAR SubBlock[MAX_PATH];
 memset((void*)SubBlock,0,sizeof(SubBlock));

 for(UINT i=0; i < (uiOtherSize / sizeof(LANGANDCODEPAGE)); i++ )
 {
  //获取每种 CodePage 和 Language 资源的相关信息
  wsprintf(SubBlock,
            TEXT("//StringFileInfo//%04x%04x//OriginalFilename"),
            pLanguage[i].wLanguage,
            pLanguage[i].wCodePage);

//   Comments InternalName ProductName
//   CompanyName LegalCopyright ProductVersion
//   FileDescription LegalTrademarks PrivateBuild
//   FileVersion OriginalFilename SpecialBuild  

  // OriginalFilename 可由上面的各种代替。


  // Retrieve file description for language and code page "i".
  VerQueryValue(pBuffer,
   SubBlock,
   (PVOID*)&pTmp,
   &uiOtherSize);
  TCHAR chOriginalFileName[MAX_PATH];
  memset((void*)chOriginalFileName,0,sizeof(chOriginalFileName));
  _tcscpy(chOriginalFileName,(TCHAR*)pTmp);
  MessageBox(NULL,chOriginalFileName,_T("Succeed!"),MB_OK);
 }
 delete []pBuffer;
 pBuffer = NULL;
}

记得在Project->Settings->Linking 的Object/library modules 内输入 version.lib这个库。

当然头文件需加上#include <tchar.h>

和 #include <windows.h>

其余的就没什么了。希望能对你有帮助。

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值