• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Получение версии приложения

  • Автор темы Jeefo
  • Дата начала
J

Jeefo

Добрый вечер.
Понадобилось определить версию exe-приложения. Поиски в инете направили в сторону функций GetFileVersionInfoSize, GetFileVersionInfo и VerQueryValue. С первыми двумя нормально разобрался, а вот с последней возникла проблема: во втором параметре ей нужно передать язык и кодовую страницу. В дельфях в качестве примера предлагают '040904E4', однако с русским языком оно не работает. Нашел подходящее значение для русского языка - '041904E3', но в этом случае получается что я жестко задаю язык, и с другими языками у моей программы возникнут проблемы. Вопрос же состоит в следующем: можно ли программно определить требуемый для конкретного приложения язык и использовать в функции именно его? Как?
 
Z

zubr

Искать надо сначала в MSDN. Там в описании функции VerQueryValue есть и пример, в котором перечисляются языки из блока полученного функцией GetFileVersionInfo.
 
J

Jeefo

zubr
А не могли бы вы привести мне подобный пример, но на Delphi? Пример на мсдн просмотрел, с получением списка языков вроде разобрался, но вот что там происходит дальше, в цикле, для меня загадка.
 
Z

zubr

Код:
type
LANGANDCODEPAGE = record
wLanguage: Word;
wCodePage: Word;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
dwHandle, cbTranslate, lenBuf: cardinal;
sizeVers: DWord;
lpData, langData: Pointer;
lpTranslate: ^LANGANDCODEPAGE;
i: Integer;
s: string;
buf:PChar;
begin
sizeVers := GetFileVersionInfoSize('MyProgram.exe', dwHandle);
If sizeVers = 0 then
exit;
GetMem(lpData, sizeVers);
try
ZeroMemory(lpData, sizeVers);
GetFileVersionInfo ('MyProgram.exe', 0, sizeVers, lpData);
If not VerQueryValue (lpData, '\VarFileInfo\Translation', langData, cbTranslate) then
exit;
For i := 0 to (cbTranslate div sizeof(LANGANDCODEPAGE)) do
begin
lpTranslate := Pointer(Integer(langData) + sizeof(LANGANDCODEPAGE) * i);
s := Format('\StringFileInfo\%.4x%.4x\FileVersion', [lpTranslate^.wLanguage,
lpTranslate^.wCodePage]);
If VerQueryValue (lpData, PChar(s), Pointer(buf), lenBuf) then
begin
MessageBox(0, buf, '', MB_OK);
break;
end;
end;
finally
FreeMem(lpData);
end;
end;
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!