![]() |
Problem mit LoadString bei 64 bit
Hallo,
ich habe ein Problem mit LoadString in 64-bit Windows.
Delphi-Quellcode:
Funktioniert in WIN32 ohne jedes Problem, als Wert für deutsch wird korrekt 1000 aus dem Ressourcenfile zurückgeliefert, SizeOfBuffer ist 4.
class procedure TResourceMeldung.GetResMeldung(var ResMeldung: TStringlist; Offset : integer; lang: string);
var buffer : array[0..MaxBuffer] of char; ls : integer; idx, lng : integer; maxPos : integer; begin if lowercase(lang) = 'de' then lng := 1; if lowercase(lang) = 'en' then lng := 2; if lowercase(lang) = 'fr' then lng := 3; if lowercase(lang) = 'sp' then lng := 4; ls := GetOffset(lng); maxPos := GetMaxPos(offset); if ls = 0 then exit; for idx := ls to ls+MaxPos do begin ResMeldung.Add(GetString(Offset + idx)); end; end; class function TResourceMeldung.GetOffset(lg: integer): integer; var buffer : array[0..MaxBuffer] of char; ls : integer; begin Result := 0; ls := LoadString(hInstance, lg, buffer, sizeof(buffer)); if ls <> 0 then begin Result := strtoint(buffer); end; end; WIN64 liefert ???, sowohl Server 2008 wie Win7 Home, SizeOfBuffer ist 3. Bin dankbar für jeden Hinweis, da beim suchen nicht wirklich fündig geworden. Johannes |
AW: Problem mit LoadString bei 64 bit
PS: SizeOf(buffer) ist falsch, denn es müßte Length(buffer) heißen, da dieser Parameter die Anzahl der Zeichen und nicht der Bytes angibt.
Probier mal ein WideChar-Array und LoadStringW, eventuell gibt es dort Problemchen mit der Ansi-Variante? :gruebel: Wobei aber SizeOf nur abhänig vom Compiler sein sollte und nicht vom Betriebssystem, da die Datenstuktur ganz alleine vom Compiler und dessen Einstellungen abhängig ist. |
AW: Problem mit LoadString bei 64 bit
Ich hab' jetzt den Code mal so geändert:
Delphi-Quellcode:
Bei WIN64 kommt jetzt ein Fragezeichen statt vorher dreien.
class function TResourceMeldung.GetOffset(lg: integer): integer;
var buffer : PWidechar; ls : integer; begin Result := 0; ls := LoadStringW(hInstance, lg, @buffer, length(buffer)); if ls <> 0 then begin Result := strtoint(buffer^); end; end; In WIN 32 ist das Ergebnis 1000200030004000, erwartet und in der Ursprungsversion geliefert wird 1000. Setze ich einen anderen Startpunkt, wird das Ergebnis entsprechend verkürzt, z.B. auf 30004000. |
AW: Problem mit LoadString bei 64 bit
Weitere Variante die unter W32 funktioniert, aber unter W64 als Ergebnis in buffer nur ??? liefert.
Delphi-Quellcode:
Hat jemand eine Idee ?
class function TResourceMeldung.GetOffset(lg: integer): integer;
var buffer : array[0..1023] of Widechar; ls : integer; begin Result := 0; ls := LoadStringW(hInstance, lg, @buffer, length(buffer)); if ls <> 0 then begin showmessage(inttostr(length(buffer))); showmessage(buffer); end; end; |
AW: Problem mit LoadString bei 64 bit
Wie bekommst du hInstance bzw. welche Datei sollt hInstance repräsentieren?
|
AW: Problem mit LoadString bei 64 bit
Ich benutze nur ein Ressourcenfile, hinstance wird nicht explizit zugewiesen, repräsentiert meine Bibliotheksname.res, in W32 ist wie gesagt bisher kein Problem aufgetreten.
|
AW: Problem mit LoadString bei 64 bit
Zitat:
was steht denn in buffer wenn Du den debugger bemühst? oder immer wieder gern genommen:
Delphi-Quellcode:
Gruß
for i:=0 to sizeof(buffer) do
msg:=msg+inttohex(buffer[i],2); showmessage(msg); K-H |
AW: Problem mit LoadString bei 64 bit
Es kommen in beiden Fällen die gleichen Rückgaben: der korrekte Wert 1000 bei WIN32 und ??? bei WIN64.
|
AW: Problem mit LoadString bei 64 bit
Zitat:
1. buffer ist nicht initialisiert worden und somit zeigt der Pointer irgendwohin. 2. sollte beim Aufruf wohl besser das @-Zeichen weggelassen werden, sonst hat man einen Pointer auf den Pointer |
AW: Problem mit LoadString bei 64 bit
Ich habe das Problem mittlerweile gelöst - oder umgangen ?
Den Stringtable der Ressource hatte ich über den Visual C- Editor erstellt, als Sprache war "German" angegeben. Das habe ich jetzt umgestellt auf "neutral". Die Fehler sind jetzt bei beiden Zugriffsmethoden weg. Leider verstehe ich immer noch nicht warum :oops: Es funktioniert also
Delphi-Quellcode:
genauso wie
class function TResourceMeldung.GetOffset(lg: integer): integer;
var buffer : array[0..MaxBuffer] of char; ls : integer; begin Result := 0; ls := LoadString(hInstance, lg, buffer, length(buffer)); if ls <> 0 then Result := strtoint(buffer); end;
Delphi-Quellcode:
Danke an alle für die Unterstützung !
class function TResourceMeldung.GetOffset(lg: integer): integer;
var buffer : array[0..1023] of Widechar; ls : integer; begin Result := 0; ls := LoadStringW(hInstance, lg, @buffer, length(buffer)); if ls <> 0 then Result := strtoint(buffer^); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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