![]() |
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 |
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). |
AW: Sprach ID aus Exe auslesen
Vielleicht in JclFileVersion => TJclFileVersionInfo
Siehe auch das Beispielprogramm dazu. |
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; |
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:
Automatische Speicherverwaltung und Casten in gleich den "richtigen" Typen ... hach, das Leben könnte so einfach sein.
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; |
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 |
AW: Sprach ID aus Exe auslesen
Zitat:
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. |
AW: Sprach ID aus Exe auslesen
Hmm...
Wieso macht ihr das nicht so wie MS es sogar in seinem Beispiel angibt:
Delphi-Quellcode:
Das sollte doch für 32 und 64 Bit funktionieren ?
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; (Kann es gerade nicht mit 64bit testen)
Delphi-Quellcode:
Selbst ein Durchgehen durch alle Codes ist so sauber möglich...
for Idx := 0 to Pred(TranslationLen) do
begin ShowMessage(Format('Sprach-ID: %.4x, Codepage: %.4x', [Translation.Lang, Translation.CharSet])); Inc(Translation); end; 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