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

Тема в разделе "Delphi - FAQ", создана пользователем Jeefo, 13 сен 2008.

  1. Jeefo

    Jeefo Гость

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

    zubr Гость

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

    Jeefo Гость

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

    zubr Гость

    Код (Text):
    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;
     
  5. Jeefo

    Jeefo Гость

    Благодарю за помощь
     
Загрузка...

Поделиться этой страницей