AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sprach ID aus Exe auslesen

Ein Thema von BastiFantasti · begonnen am 16. Jul 2025 · letzter Beitrag vom 22. Jul 2025
Antwort Antwort
Seite 1 von 2  1 2      
BastiFantasti

Registriert seit: 5. Nov 2014
Ort: Baden Württemberg
145 Beiträge
 
Delphi 12 Athens
 
#1

Sprach ID aus Exe auslesen

  Alt 16. Jul 2025, 14:27
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
Bastian
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#2

AW: Sprach ID aus Exe auslesen

  Alt 16. Jul 2025, 14:45
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).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
KHJ

Registriert seit: 15. Dez 2005
42 Beiträge
 
Delphi 12 Athens
 
#3

AW: Sprach ID aus Exe auslesen

  Alt 16. Jul 2025, 16:14
Vielleicht in JclFileVersion => TJclFileVersionInfo
Siehe auch das Beispielprogramm dazu.
Karlheinz Jansen
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
778 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Sprach ID aus Exe auslesen

  Alt 17. Jul 2025, 14:22
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;
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#5

AW: Sprach ID aus Exe auslesen

  Alt 17. Jul 2025, 16:29
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Jul 2025 um 16:31 Uhr)
  Mit Zitat antworten Zitat
BastiFantasti

Registriert seit: 5. Nov 2014
Ort: Baden Württemberg
145 Beiträge
 
Delphi 12 Athens
 
#6

AW: Sprach ID aus Exe auslesen

  Alt 18. Jul 2025, 06:07
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
Bastian
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
778 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Sprach ID aus Exe auslesen

  Alt 18. Jul 2025, 08:20
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.
Michael Gasser
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#8

AW: Sprach ID aus Exe auslesen

  Alt 18. Jul 2025, 09:44
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?
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)

Geändert von HolgerX (18. Jul 2025 um 09:51 Uhr)
  Mit Zitat antworten Zitat
BastiFantasti

Registriert seit: 5. Nov 2014
Ort: Baden Württemberg
145 Beiträge
 
Delphi 12 Athens
 
#9

AW: Sprach ID aus Exe auslesen

  Alt 21. Jul 2025, 07:59
Guten morgen zusammen,

ja das Microsoft Beispiel wie oben angegeben funktioniert für 32/64 Bit.
Auf der Seite von Microsoft wo die Funktionen und Variablen entsprechend aufgelistet sind konnte ich aber nichts über das Auslesen der Sprache finden.
Nur die Infos wie Version, Firma, Produktname, usw...

Die Funktion über die JVCL wie in deren Beispiel beschrieben funktionieren auch.

Kann man aus den Delphi Resource Dateien auch die Sprachinfo auslesen (die für die Übersetzung verwendeten .de-DE, .en-US, usw)?
Dann wäre man hier etwas flexibler mit der Namenskonvention und müsste z.B. für die deutsche Übersetzung nicht nach .DE, .de-DE, .DEU, .de-AT usw. parsen.
Bastian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#10

AW: Sprach ID aus Exe auslesen

  Alt 21. Jul 2025, 14:05
Kann man aus den Delphi Resource Dateien auch die Sprachinfo auslesen (die für die Übersetzung verwendeten .de-DE, .en-US, usw)?
Das kommt drauf an, ob Delphi nur auf die Dateiendung geht (was es tut)
und ob sie dennoch die Sprachinfos an der Ressource gesetzt haben. (wäre Ideal, dann wäre es ja auch möglich mehrere Sprachen in einer Datei zu haben, bzw. alles auch direkt in EXE/DLL zu linken)

Aber ich denke mal nicht, dass sie die Sprache hier gesetzt haben (hab aber auch nicht nachgesehn)

Die .de usw. sind ja einfach nur Ressoucen-DLLs, genauso wie die CodeDLL, wo die englische Ressourcen einkompiliert sind.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 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