Bonjir 2022-07-10 22:02 采纳率: 71.4%
浏览 28
已结题

VerQueryValue发生错误找不到资源类型

我想要通过VerQueryValue获取文件信息,因此写了一个GetFileVersion函数。这对于部分exe文件时可行的,但是不适用于全部。
我总共尝试获取了五个文件的信息,但只成功了三个。GetLastError显示为ERROR_RESOURCE_TYPE_NOT_FOUND(找不到资源类型),请帮忙分析下哪里出了问题。。

img

尤其是QQ\unins000.exe,这个程序甚至有不同于文件名的文件描述,却无法提取。
(系统显示其文件描述为Setup/Uninstall)

img

下面为我的源码

//main
    cout<<GetFileVersion("C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe")<<endl;
    cout<<GetFileVersion("C:\\Program Files (x86)\\Dev-Cpp\\devcpp.exe")<<endl;
    cout<<GetFileVersion("C:\\Program Files (x86)\\360\\360safe\\360Safe.exe")<<endl;
    cout<<GetFileVersion("C:\\Program Files (x86)\\Tencent\\QQ\\unins000.exe")<<endl;
    cout<<"\tErrorCode:"<<GetLastError()<<endl;
    cout<<GetFileVersion("C:\\Program Files (x86)\\Dev-Cpp\\devcppPortable.exe")<<endl;
    cout<<"\tErrorCode:"<<GetLastError()<<endl;
string GetFileVersion(char *strFilePath){
    DWORD dwSize;
    DWORD dwRtn;
    std::string szVersion;
    //获取版本信息大小
    dwSize = GetFileVersionInfoSize(strFilePath, NULL);
    if (dwSize == 0)
    {
        return "Error: 读取文件失败!";
    }
    char *pBuf;
    pBuf = new char[dwSize + 1];
    if (pBuf == NULL)
        return "";
    memset(pBuf, 0, dwSize + 1);
    //获取版本信息
    dwRtn = GetFileVersionInfo(strFilePath, 0, dwSize, pBuf);
    if (dwRtn == 0){
        return "Error: 版本信息获取失败";
    }
    LPVOID lpBuffer = NULL;
    UINT uLen = 0;
    //版本资源中获取信息
 
    dwRtn = VerQueryValue(pBuf,
                        "\\StringFileInfo\\080404b0\\FileDescription",//中文 
                        &lpBuffer,
                        &uLen);
    if (dwRtn == 0)
    {
        dwRtn = VerQueryValue(pBuf,
                        "\\StringFileInfo\\040904e4\\FileDescription",//英文 
                        &lpBuffer,
                        &uLen);
        if(!dwRtn)return "Error: Unknown Lang codepage"; 
    }
    szVersion = (char *)lpBuffer;
    delete pBuf;
    return szVersion;
}

另外,有没有人知道日语和中文繁体的lang_codepage是什么啊,我只知道四位分别是0411和0404,后四位不知道啊。。

最后劳烦一位巨佬看看有没有什么办法。。@浪客

  • 写回答

2条回答 默认 最新

  • 浪客 2022-07-12 16:08
    关注
    
    struct LANGANDCODEPAGE
    {
        WORD wLanguage;
        WORD wCodePage;
    } * lpTranslate;
    
    string GetFileVersion(char *strFilePath)
    {
        DWORD dwSize;
        DWORD dwRtn;
        std::string szVersion;
        //获取版本信息大小
        dwSize = GetFileVersionInfoSize(strFilePath, NULL);
        if (dwSize == 0)
        {
            return "Error: 读取文件失败!";
        }
        char *pBuf;
        pBuf = new char[dwSize + 1];
        if (pBuf == NULL)
            return "";
        memset(pBuf, 0, dwSize + 1);
    
        //获取版本信息
        dwRtn = GetFileVersionInfo(strFilePath, 0, dwSize, pBuf);
        if (dwRtn == 0)
        {
            return "Error: 版本信息获取失败";
        }
    
        LPVOID lpBuffer = NULL;
        UINT uLen = 0;
        UINT uCodeLen = 0;
        //版本资源中获取信息
        char *Block = new char[255]{0};
    
        //获取页代码
        DWORD cbTranslate = 0;
        VerQueryValue(pBuf,
                      TEXT("\\VarFileInfo\\Translation"),
                      (LPVOID *)&lpTranslate,
                      &uCodeLen);
        if (uCodeLen >= sizeof(struct LANGANDCODEPAGE))
        // for (int i = 0; i < (uCodeLen / sizeof(struct LANGANDCODEPAGE)); i++)
        {
            wsprintf(Block,
                     TEXT("\\StringFileInfo\\%04x%04x\\FileDescription"),
                     lpTranslate[0].wLanguage,
                     lpTranslate[0].wCodePage);
    
            dwRtn = VerQueryValue(pBuf, Block, &lpBuffer, &uLen);
            if (!dwRtn)
                return "Error: Unknown Lang codepage";
        }
    
        szVersion = (char *)lpBuffer;
        delete pBuf;
        delete Block ;
        return szVersion;
    }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月21日
  • 已采纳回答 7月13日
  • 创建了问题 7月10日

悬赏问题

  • ¥15 前端echarts坐标轴问题
  • ¥15 CMFCPropertyPage
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳