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,后四位不知道啊。。

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


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

@浪客 劳烦一下大佬,有没有什么办法啊