Как пройти через многоязычную версию ресурса?

Я пытаюсь использовать показанный фрагмент кода в конце этой страницы читать многоязычную версию ресурса для исполняемых файлов.

Но, например, когда я запускаю приведенный ниже код для этого файла:

введите описание изображения здесь

Я понимаю 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

Решение

Существует два способа хранения многоязычных версий ресурсов.

Лучше всего, конечно, иметь одну запись ресурса с несколькими блоками перевода. Они будут доступны с VerQueryValue,

Другой способ — хранить несколько записей ресурсов, по одной для каждого языка. Это способ хранения других типов локализованных ресурсов (растровые изображения, строки и т. Д.). EnumResourceLanguages должен быть в состоянии перечислить их, но GetFileVersionInfo вероятно, просто выберет язык, который соответствует вашей теме или языку пользовательского интерфейса.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]