![]() |
LoadStringW & nBufferMax > 255?
Ich verwende nachfolgende Funktion, um mein Programm mehrspraching (inkl. Unicode) zu machen. Dabei wird anhand einer ResID der entsprechende Text aus einer Ressource geholt. Das funktioniert auch alles soweit.
Delphi-Quellcode:
Die im Code verwendete Beschränkung habe ich mir an einem anderen Beispiel abgeschaut. Nun würde ich gerne an der einen oder anderen Stelle auch Text mit mehr als 255 Zeichen verwenden und frage mich, ob ich diese Zahl nicht einfach hochsetzen kann!? Ich habe das mal ausprobiert und es scheint zu funktionieren. Allerdings bin ich skeptisch.
var
p: PWideChar; begin p := StrAllocW(256); try if LoadStringW(hInstance, ResID, p, 255) <> 0 then Result := p else Result := ''; finally StrDisposeW(p); end; end; Auf ![]() Kann jemand was dazu sagen? |
AW: LoadStringW & nBufferMax > 255?
Diese Warnung steht da, da das Genannte passieren kann, wenn man einen zu kleinen Puffer übergibt (dein p), als man behauptet (deine 255).
PS: Die paar Byte passen auch auf den Stack. Ist wesentlich schneller, als erst über den Speichermanager zu gehn.
Delphi-Quellcode:
oder man nimmt den String selber als Puffer, statt des p.
var
Temp: array[0..1023] of WideChar; begin if LoadStringW(hInstance, ResID, @Temp, Length(temp)) <> 0 then Result := Temp else Result := ''; end;
Delphi-Quellcode:
Oder du versucht mal direkt auf die Resource zuzugreifen.
begin
SetLength(Result, 1024); SetLength(Result, LoadStringW(hInstance, ResID, PChar(Result), Length(Result)); end; Zitat:
|
AW: LoadStringW & nBufferMax > 255?
Hallo himitsu, vielen Dank für Deine schnelle und sehr hilfreiche Antwort! Ich beneide es, wenn jemand bei einer solchen Frage gleich mehrere Lösungen aus dem Ärmel schütteln kann. :)
Die Lösung mit dem Stack funktioniert wunderbar! Habe auch einen kleinen Speedtest gemacht und es läuft tatsächlich rund 20% schneller (wobei wir hier von Werten im Millisekunden-Bereich reden). Dennoch: Funktioniert und läuft schneller -> Top! :thumb: (Die Lösung mit dem String als Puffer wollte bei mir irgendwie nicht. Die Texte wurden gar nicht oder falsch ausgegeben. Aber das braucht uns nicht weiter beschäftigen. Bin mir der ersten Methode vollends zufrieden.) edit: Geht doch, war mein Fehler, aber ist (wie erwartet) etwa gleich schnell wie meine Version. -> daher immer noch direkte-Stack-Variante als beste Lösung ;) Wünsche ein schönes Wochenende! :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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