如何遍历多语言版本资源?

时间:2017-11-22 17:56:16

标签: c++ winapi mui

我正在尝试使用显示at the end of this page的代码段来读取可执行文件的多语言版本资源。

但是,例如,当我为此文件运行以下代码时:

enter image description here

我的nCnt仅为1,因为只有一种资源,即英文。

我做错了什么?

LPCTSTR buff = L"path-to\\file.exe";

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

DWORD dwDummy;
DWORD dwSz = GetFileVersionInfoSize(buff, &dwDummy);
if(dwSz > 0)
{
    BYTE* pData = new (std::nothrow)BYTE[dwSz];
    if(pData)
    {
        if(GetFileVersionInfo(buff, NULL, dwSz, pData))
        {
            //Get language info
            UINT ncbSz;
            LANGANDCODEPAGE* pLcp;
            if(VerQueryValue(pData, L"\\VarFileInfo\\Translation", (VOID**)&pLcp, &ncbSz))
            {
                UINT nCnt = ncbSz / sizeof(struct LANGANDCODEPAGE);

                CString strQuery;
                UINT nczBufLn;
                LPCTSTR pDescBuf;

                for(UINT i = 0; i < nCnt; i++)
                {
                    strQuery.Format(L"\\StringFileInfo\\%04x%04x\\FileDescription", 
                        pLcp[i].wLanguage, pLcp[i].wCodePage);
                    if(VerQueryValue(pData, (LPTSTR)strQuery.GetString(), (VOID**)&pDescBuf, &nczBufLn))
                    {
                        wprintf(L"Description%d: %s\n", i, pDescBuf);
                    }
                }
            }
        }

        delete[] pData;
    }
}

1 个答案:

答案 0 :(得分:1)

有两种方法可以存储多语言版本资源。

当然,最好的办法是让一个资源条目包含多个翻译块。可以使用VerQueryValue访问这些内容。

另一种方法是存储多个资源条目,每种语言一个。这是存储其他类型的本地化资源(位图,字符串等)的方式。 EnumResourceLanguages应该能够枚举它们,但GetFileVersionInfo可能只选择与您的线程或UI语言匹配的语言。