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 2 von 2     12   
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
730 Beiträge
 
Delphi XE5 Professional
 
#11

AW: Sprach ID aus Exe auslesen

  Alt 21. Jul 2025, 15:17
Hallo,
ich habe den Code von Himitsu (#5) und HolgerX (#8) ausprobiert: Kompilieren sowohl für Win32 als auch für Win64 gehen,
ABER
Delphi-Quellcode:
  InfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), InfoSize);
  if InfoSize > 0 then
  begin
  …

     ShowMessage(Format('Sprach-ID: %.4x, Codepage: %.4x', [LangID, CodePage]));
  end;
InfoSize > 0 ist NUR bei Win32 DEBUG der Fall, NICHT bei Release; Bei Win64 überhaupt nicht.
Das heißt:
ShowMessage(Format('Sprach-ID: %.4x, Codepage: %.4x', [LangID, CodePage])); wird nur ein einziges Mal angezeigt, in den restlichen 3 Fällen überhaupt nicht.

Ist das etwa beabsichtigt, oder mache ich etwas falsch?

[Edit]
Und HolgerX's
Delphi-Quellcode:
for Idx := 0 to Pred(TranslationLen) do
begin
  ShowMessage(Format('Sprach-ID: %.4x, Codepage: %.4x', [Translation.Lang, Translation.CharSet]));
  Inc(Translation);
end;
ergibt eine Endlosschleife
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (21. Jul 2025 um 15:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Sprach ID aus Exe auslesen

  Alt 21. Jul 2025, 18:00
Zitat:
Delphi-Quellcode:
 if InfoSize > 0 then
 ...
 end;
Delphi-Quellcode:
 if InfoSize > 0 then
 ...
 end else
   RaiseLastOSError;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
HolgerX

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

AW: Sprach ID aus Exe auslesen

  Alt 21. Jul 2025, 18:54
Hmm..

So nochmals nach Recherche überarbeitet:

Delphi-Quellcode:
type
  TTransRec = packed record
    Lang, // language code
    CharSet: Word; // character set (code page)
  end;
  PTransRec = ^TTransRec; // pointer to TTransRec

const
  LOCALE_NAME_MAX_LENGTH = 85;

function LCIDToLocaleName(Locale: LCID; lpName: LPWSTR; cchName: Integer;
  dwFlags: DWORD): Integer; stdcall;external kernel32 name 'LCIDToLocaleName';

function LocaleIDString(aLCID : DWORD): WideString;
var
  strNameBuffer : array [0..LOCALE_NAME_MAX_LENGTH-1] of WideChar;
begin
  Result := '';
  if (LCIDToLocaleName(aLCID, strNameBuffer, LOCALE_NAME_MAX_LENGTH, 0) <> 0) then
    Result := strNameBuffer;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  InfoSize: DWORD;
  InfoData: Array of Byte;
  Translation: PTransRec;
  TranslationLen: UINT;
  RecCount: Integer; // number of translation records
  Idx : Integer;
begin
  if OpenDialog1.Execute then
  begin
    InfoSize := GetFileVersionInfoSize(PChar(OpenDialog1.FileName), InfoSize);
    if InfoSize > 0 then
    begin
      SetLength(InfoData, InfoSize);
      if GetFileVersionInfo(PChar(OpenDialog1.FileName), 0, InfoSize, @InfoData[0]) then
      begin
        if VerQueryValue(@InfoData[0], '\VarFileInfo\Translation', Pointer(Translation), TranslationLen) then
        begin
          RecCount := TranslationLen div SizeOf(TTransRec);
          Memo1.Lines.Add(IntToStr(RecCount));
          for Idx := 0 to Pred(RecCount) do
          begin
            Memo1.Lines.Add(Format('Sprach-ID: %.4x, Codepage: %.4x', [Translation.Lang, Translation.CharSet]));
            Memo1.Lines.Add(LocaleIDString(Translation.Lang));
            Inc(Translation);
          end;
        end;
      end;
    end;
  end;
end;
Mit D6 erhalte ich aber bei fast alle EXE immer nur einen Translation Eintrag!
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
730 Beiträge
 
Delphi XE5 Professional
 
#14

AW: Sprach ID aus Exe auslesen

  Alt 21. Jul 2025, 19:12
Zitat:
Delphi-Quellcode:
 if InfoSize > 0 then
 ...
 end;
Delphi-Quellcode:
 if InfoSize > 0 then
 ...
 end else
   RaiseLastOSError;
Jetzt verstehe ich die Welt nicht mehr: Nun bekomme ich in ALLEN Debug Fällen, egal ob Win32 oder Win64 die Exception:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Sprach_ID_aus_Exe_auslesen_1.exe ist eine Exception der Klasse EOSError mit der Meldung 'Systemfehler. Code: 1813.
Der angegebene Ressourcentyp wurde nicht in der Image-Datei gefunden' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------


Und die kompilierten Exe liefern in allen 4 Fällen gar nichts mehr:

Delphi-Quellcode:
 
ShowMessage(Format('Sprach-ID: %.4x, Codepage: %.4x', [LangID, CodePage]));
Wird anscheinend überhaupt nicht mehr ausgeführt.
Und den früheren Zustand kann ich auch nicht mehr wiederherstellen. Auch ein frisches neues Projekt verhält sich genauso...
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
289 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: Sprach ID aus Exe auslesen

  Alt 22. Jul 2025, 06:30
Hi,
lass mal infoSize als Parameter weg:

[out, optional] lpdwHandle

Type: LPDWORD

A pointer to a variable that the function sets to zero.
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
730 Beiträge
 
Delphi XE5 Professional
 
#16

AW: Sprach ID aus Exe auslesen

  Alt 22. Jul 2025, 09:10
Hi,
meinst Du, ich soll InfoSize hier weglassen?
InfoSize:= WinApi.Windows.GetFileVersionInfoSize(PChar(ParamStr(0)), InfoSize); In XE5 ist InfoSize kein Optionaler Parameter: --> Es läßt sich nicht kompilieren...
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.599 Beiträge
 
Delphi 7 Professional
 
#17

AW: Sprach ID aus Exe auslesen

  Alt 22. Jul 2025, 09:55
Delphi-Quellcode:
var
  Dummy: DWORD;
...
InfoSize:= WinApi.Windows.GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
...
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.599 Beiträge
 
Delphi 7 Professional
 
#18

AW: Sprach ID aus Exe auslesen

  Alt 22. Jul 2025, 10:31
Diese Routine liefert mir unter Delphi 7 und Windows 11 für fast alle Exen unter c:\Windows\ die passende SprachID und die zugehörige Sprache im Klartext, dabei ist zu beachten, dass 0 eine gültige SprachID ist und für Sprachneutralität steht.
Delphi-Quellcode:
function GetExeLanguageID(const FileName: string; out LangID: Word; out Language : String) : Boolean;
var
  InfoSize, Dummy: DWORD;
  InfoData: Pointer;
  TransPtr: Pointer;
  TransLen: UINT;
  Buffer : array[0..255] of Char;
begin
  LangID := 0;
  Language := '<keine FileVersionInfo vorhanden>';
  InfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
  Result := InfoSize <> 0;
  if not Result then Exit;

  Language := '<unbekannt>';
  GetMem(InfoData, InfoSize);
  try
    if GetFileVersionInfo(PChar(FileName), 0, InfoSize, InfoData) and
       VerQueryValue(InfoData, '\\VarFileInfo\\Translation', TransPtr, TransLen) and
       (TransLen >= 4) then
    begin
      LangID := PWord(TransPtr)^; // Language ID holen (0 für Neutral ist gültig!)
      ZeroMemory(@Buffer, SizeOf(Buffer)); // Buffer vorsichtshalber leeren
      if VerLanguageName(LangID, Buffer, Length(Buffer)) <> 0 then
        Language := StrPas(Buffer)
      else
        Language := '<unbekannt>';
      Result := True;
    end;
  finally
    FreeMem(InfoData);
  end;
end;
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
289 Beiträge
 
Delphi 10.3 Rio
 
#19

AW: Sprach ID aus Exe auslesen

  Alt 22. Jul 2025, 11:32
Oder so. Einfach einen Dummy da hin. Wobei ich mich frage, welchen Sinn dieser Parameter dann hat.
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.599 Beiträge
 
Delphi 7 Professional
 
#20

AW: Sprach ID aus Exe auslesen

  Alt 22. Jul 2025, 11:48
Der zweite Parameter dient nur zu Kompabilität und kann ignoriert werden. Sein Zweck ist nur, den Funktionsprototyp zu erfüllen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 20:09 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