Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Sprach ID aus Exe auslesen (https://www.delphipraxis.net/217516-sprach-id-aus-exe-auslesen.html)

BastiFantasti 16. Jul 2025 14:27

Sprach ID aus Exe auslesen
 
Hallo zusammen,

mit den Winapi Aufrufen GetFileVersionInfoSize/GetFileVersionInfo ist es ja möglich sämtliche Informationen aus der Exe auszulesen wie:
- Versionsnummern,
- Firmenname
- Produktname
...
- SpecialBuild
- DebugBuild
usw

Die "Sprache ID" kann man auch auf der Versionsinfo Seite definieren,
nur habe ich bis jetzt keine Möglichkeit gefunden, die "Sprache ID" Eigenschaft später zur Laufzeit auszulesen.

Hat hier jemand eine Idee?

Viele Grüße
Bastian

Uwe Raabe 16. Jul 2025 14:45

AW: Sprach ID aus Exe auslesen
 
Mit VerQueryValue und "\VarFileInfo\Translation" für den lpSubBlock Parameter kommst du an die Liste der unterstützen Sprachen. Wie üblich ist das aber eine gehörige Frickelei.

Falls du die FireDAC-Sourcen hast findest du ein Beispiel in FDGetVersionInfo (FireDAC.Stan.Utils.pas).

KHJ 16. Jul 2025 16:14

AW: Sprach ID aus Exe auslesen
 
Vielleicht in JclFileVersion => TJclFileVersionInfo
Siehe auch das Beispielprogramm dazu.

Michael II 17. Jul 2025 14:22

AW: Sprach ID aus Exe auslesen
 
Dies funktioniert bei meiner App. (Copilot ;-))
Delphi-Quellcode:
procedure sprachIDCodepage;
var
  InfoSize: DWORD;
  InfoData: Pointer;
  Translation: Pointer;
  TranslationLen: UINT;
  LangID, CodePage: Word;
begin
  InfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), InfoSize);
  if InfoSize > 0 then
  begin
    GetMem(InfoData, InfoSize);
    try
      if GetFileVersionInfo(PChar(ParamStr(0)), 0, InfoSize, InfoData) then
      begin
        if VerQueryValue(InfoData, '\VarFileInfo\Translation', Translation, TranslationLen) then
        begin
          LangID := MakeWord(PByte(Translation)^, PByte(Integer(Translation) + 1)^);
          CodePage := MakeWord(PByte(Integer(Translation) + 2)^, PByte(Integer(Translation) + 3)^);
          ShowMessage(Format('Sprach-ID: %x, Codepage: %x', [LangID, CodePage]));
        end;
      end;
    finally
      FreeMem(InfoData);
    end;
  end;
end;

himitsu 17. Jul 2025 16:29

AW: Sprach ID aus Exe auslesen
 
Und knallt hoffentlich wunderschön, mit 64 Bit.

Wer nach 14 20 Jahren des 64-Bit-Delphi 64-Bit-Windows immernoch Pointer zu Integer castet, dem gehört ordentlich der Popo versohlt.

Delphi-Quellcode:
procedure SprachID2Codepage;
var
  InfoSize: DWORD;
  InfoData: TBytes;
  Translation: Pointer;
  TranslationLen: UINT;
  LangID, CodePage: Word;
begin
  InfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), InfoSize);
  if InfoSize > 0 then
  begin
    SetLength(InfoData, InfoSize);
    if GetFileVersionInfo(PChar(ParamStr(0)), 0, InfoSize, @InfoData[0]) then
    begin
      if VerQueryValue(@InfoData[0], '\VarFileInfo\Translation', Translation, TranslationLen) then
      begin
        LangID  := PWord(Translation)^;
        CodePage := PWord(IntPtr(Translation) + 2)^; // oder PByte statt IntPtr/Pointer und schön die Pointer-Arithmetik nutzen :D
        ShowMessage(Format('Sprach-ID: %.4x, Codepage: %.4x', [LangID, CodePage]));
      end;
    end;
  end;
end;
Automatische Speicherverwaltung und Casten in gleich den "richtigen" Typen ... hach, das Leben könnte so einfach sein.

BastiFantasti 18. Jul 2025 06:07

AW: Sprach ID aus Exe auslesen
 
Guten Morgen zusammen,

danke für die Rückmeldungen!
Ich werde die genannten Möglichkeiten unter 32 und 64 Bit probieren und berichten.

Viele Grüße
Bastian

Michael II 18. Jul 2025 08:20

AW: Sprach ID aus Exe auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1550299)
Und knallt hoffentlich wunderschön, mit 64 Bit.

Wer nach 14 20 Jahren des 64-Bit-Delphi 64-Bit-Windows immer noch Pointer zu Integer castet, dem gehört ordentlich der Popo versohlt.


Automatische Speicherverwaltung und Casten in gleich den "richtigen" Typen ... hach, das Leben könnte so einfach sein.

Ja du hast Recht - aber ich kann dir versichern, an jenem Tag hat mir das Leben gleich nach dem Aufwachen den Popo fast maximal versohlt und ich wollte mich Stunden später ein wenig ablenken und helfen und habe dabei voll gepennt. Sorry.

Da ich immer wieder solche Tage habe und hier nicht mehr nerven will, melde ich mich aus diesem Forum ab. Herzlichen Dank allen, welche mir irgendwann einmal geholfen haben - und besten Dank den Betreibern des Forums für all Ihre Arbeit.

Alles Gute.

HolgerX 18. Jul 2025 09:44

AW: Sprach ID aus Exe auslesen
 
Hmm...

Wieso macht ihr das nicht so wie MS es sogar in seinem Beispiel angibt:
Delphi-Quellcode:
type
  TTransRec = packed record
    Lang, // language code
    CharSet: Word; // character set (code page)
  end;
  PTransRec = ^TTransRec; // pointer to TTransRec

procedure SprachID2Codepage;
var
  InfoSize: DWORD;
  InfoData: Array of Byte;
  Translation: PTransRec;
  TranslationLen: UINT;
begin
  InfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), InfoSize);
  if InfoSize > 0 then
  begin
    SetLength(InfoData, InfoSize);
    if GetFileVersionInfo(PChar(ParamStr(0)), 0, InfoSize, @InfoData[0]) then
    begin
      if VerQueryValue(@InfoData[0], '\VarFileInfo\Translation', Pointer(Translation), TranslationLen) then
      begin
        ShowMessage(Format('Sprach-ID: %.4x, Codepage: %.4x', [Translation.Lang, Translation.CharSet]));
      end;
    end;
  end;
end;
Das sollte doch für 32 und 64 Bit funktionieren ?
(Kann es gerade nicht mit 64bit testen)

Delphi-Quellcode:
  for Idx := 0 to Pred(TranslationLen) do
  begin
    ShowMessage(Format('Sprach-ID: %.4x, Codepage: %.4x', [Translation.Lang, Translation.CharSet]));
    Inc(Translation);
  end;
Selbst ein Durchgehen durch alle Codes ist so sauber möglich...
Oder vertue ich mich hier?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz