【发布时间】:2020-09-06 06:01:48
【问题描述】:
我正在尝试使用代码 sn-p 显示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;
}
}
【问题讨论】:
-
@RemyLebeau:嗯,这不完全一样。我什至没有在
L"\\StringFileInfo\\%04x%04x\\FileDescription"上调用VerQueryValue,当我期待3 时,使用L"\\VarFileInfo\\Translation"的调用返回1 语言的大小。这是我的问题。 -
我理解这个问题。我的观点是,翻译表容易受到人为错误的影响,并且错误地编码表是一个常见的错误。您可能有 3 种语言可用,但该表只有 1 个条目。使用资源编辑器进行验证。一些资源编译器不会报告这样的不匹配。