![]() |
Re: PChar to String & zurück - Zeichen geht verloren
Zitat:
|
Re: PChar to String & zurück - Zeichen geht verloren
@mkinzler: Danke.
/me sets mode: +gott mkinzler Das wars.. *freu* tausend dank xD Lösung falls jemand auch mal dieses Problem hat:
Delphi-Quellcode:
function aufreg(meinParameter: PChar): PChar;
var meinString: String; begin meinString := meinParameter result := PChar(meinString+#0); end; |
Re: PChar to String & zurück - Zeichen geht verloren
Wurde doch schon von Dax vorgeschlagen, habe nur seinen Vorschlag in deinen Code eingebaut.
|
Re: PChar to String & zurück - Zeichen geht verloren
Zitat:
Wenn man es anders löst, wird man sich vor nicht auffindbaren Speicherlecks nach einer Weile nicht mehr retten können. |
Re: PChar to String & zurück - Zeichen geht verloren
wtf? Entweder ich hab nen Denkfehler weil ich noch zu besoffen bin, hab das Prinzip von String/PChar in Delphi nicht verstanden oder ihr programmiert alle grauenhaft.
Strings werden von Delphi verwaltet, sind also auch gültig wenn man sie als Rückgabewert missbraucht. PChar ist das selbe wie ein Pointer. Und wenn ihr das so programmiert dann ist dieser Pointer nicht mehr gültig da dieser auf eine Lokale Variable zeigt. Sowas macht man eben nicht. Machs so wie MS mit ihren APIs: Sobald du PChars zurückbekommen willst, muss die aufrufende Funktion den Speicher allokieren und freigeben wenn sie den nicht mehr braucht. z.B. GetModuleFileName Meienr Meinung nach kann es auftreten, dass Delphi merkt, dass der lokale String nicht mehr benutzt wird und ihn überschreibt, bzw. dessen Speicher freigibt. Du arbeitest u.U. noch weiter mit diesem String (bzw. nur der Adresse) und es kann ggf crashen. Oder schreibt ihr auch so geniale Funktionen wie:
Delphi-Quellcode:
Wäre nett wenn mir mal jemand meine falsche denkweise erklärt.
function blub(a: integer): pinteger;
var s: integer; begin s := a; result := @s; end; Danke! Edit: Zitat:
Edit2: wer es testen will (Aufruf mit dem wort 'lol') Rückabe: lol
Delphi-Quellcode:
Rückgabe: lo
var
meinString: String; function aufreg(meinParameter: PChar): PChar; begin meinString := meinParameter; result := PChar(meinString); end;
Delphi-Quellcode:
function aufreg(meinParameter: PChar): PChar;
var meinString: String; begin meinString := meinParameter; result := PChar(meinString); end; |
Re: PChar to String & zurück - Zeichen geht verloren
Brechi hast vollkommen Recht. Es ist immer eine temporäre PChar Konvertierung und die verliert genauso ihre Gültigkeit wie auch die lokale string Variable mit verlassen der Funktion. Der Rückgabewert zeigt auf einen ehemals alloziierte/benutzten Block und von daher ist der Rückgabewert reiner Zufall. Grundlegend wird der Speicher bis zum auslesen des Wertes nicht erneut genutzt, und das ergibt hier den Anschein der Gültigkeit.
|
Re: PChar to String & zurück - Zeichen geht verloren
also GetMem benutzen.
|
Re: PChar to String & zurück - Zeichen geht verloren
Wie denn? In der DLL mit dem Speichermanager alloziieren und in der App mit deren Speichermanager wieder freigeben? Naja, ich sage dir jetzt schon, der eine weiss vom anderen nichts. Ausnahme: sharemem, aber dann kannste auch gleich Strings übergeben. Ich empfehle die schon zuvor genannte Methode wie es auch schon die WinAPI erfolgreich seit ein paar Jahren macht: App erzeugt einen Buffer und übergibt ihn. Siehe auch Luckies Tutorial dazu...
|
Re: PChar to String & zurück - Zeichen geht verloren
wenn die App den Buffer erzeugt, dann muss man auch erstmal wissen wie groß der Buffer sein soll.
GetTokenInformation macht das z.B. so. |
Re: PChar to String & zurück - Zeichen geht verloren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 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