Я пытаюсь использовать показанный фрагмент кода в конце этой страницы читать многоязычную версию ресурса для исполняемых файлов.
Но, например, когда я запускаю приведенный ниже код для этого файла:
Я понимаю 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;
}
}
Существует два способа хранения многоязычных версий ресурсов.
Лучше всего, конечно, иметь одну запись ресурса с несколькими блоками перевода. Они будут доступны с VerQueryValue
,
Другой способ — хранить несколько записей ресурсов, по одной для каждого языка. Это способ хранения других типов локализованных ресурсов (растровые изображения, строки и т. Д.). EnumResourceLanguages
должен быть в состоянии перечислить их, но GetFileVersionInfo
вероятно, просто выберет язык, который соответствует вашей теме или языку пользовательского интерфейса.
Других решений пока нет …