我正在尝试使用显示at the end of this page的代码段来读取可执行文件的多语言版本资源。
但是,例如,当我为此文件运行以下代码时:
我的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;
}
}
答案 0 :(得分:1)
有两种方法可以存储多语言版本资源。
当然,最好的办法是让一个资源条目包含多个翻译块。可以使用VerQueryValue
访问这些内容。
另一种方法是存储多个资源条目,每种语言一个。这是存储其他类型的本地化资源(位图,字符串等)的方式。 EnumResourceLanguages
应该能够枚举它们,但GetFileVersionInfo
可能只选择与您的线程或UI语言匹配的语言。