![]() |
Re: PChar to String & zurück - Zeichen geht verloren
@ThE_-_BliZZarD:
Ich hoffe du beachtest die Einwände von Thomas und mir. Du hast vielleicht dein Problem kurzzeitig für deinen Beispielparameter gelöst. Die Lösung mit dem #0 ist einfach nur gefrickel und absolut unsicher. Wunder dich nicht wenn dein programm irgendwann mal einfach crashed. Benutze einen String als Rückgabewert. Das geht auch in dlls, dafür musst du dann aber als erste unit sharemem benutzen. Ansonsten kann das selbe Verhalten auftreten (manchmal gehts und manchmal nicht). Oder du benutzt den WinAPI Ansatz wenn du unbedingt einen PChar benutzen willst. Alles andere ist programmiertechnisch unsauber und nicht zu empfehlen. Auch wenn es nun den Anschein hat es funktioniert. Ich hoffe für alle die mal das selbe Problem haben, dass sie diesen Thread bis zum Ende lesen. |
Re: PChar to String & zurück - Zeichen geht verloren
Ich muss mich dem anschließen, es funktioniert nicht mehr. Also bis zurück in das Mutterprog hats mein Wert geschafft, aber dann ist Ende..^^
Ich hatte irgendwo schon ein Sourcebeispiel für eine Implementation ala GetModuleFileName() gesehn, leider finde ich sie nicht mehr :roll: Hoffe ihr könnt mir nochmal verzeihen und ein gaaanz kurzes Stück Beispielcode machen :-/ Denn, ich habe leider bisher noch nie selber Speicher angefordert/beschrieben geschweige denn wieder freigegeben.. Thx in advance, BliZZarD |
Re: PChar to String & zurück - Zeichen geht verloren
Delphi-Quellcode:
function PCharDLLFunktion(str: PChar): Integer;
var s: String; begin s := StringDLLFunktion; if str = nil then Result := Length(s) else begin try Move(s[1], str^, Length(s)); Result := -1; //Success except Result := -2; //Failure end; end; end; function NichtDLLFunktion: String; begin SetLength(Result, PCharDLLFunktion(nil)); if PCharDLLFunktion(@Result[1]) <> -1 then MessageBox('Fehler'); end; // Oder so ähnlich |
Re: PChar to String & zurück - Zeichen geht verloren
hmm.. warum wurde dort jetzt nichts mit Speicher allozieren/freigeben usw gemacht?
Oder reicht das für meine Zwecke schon. (man ist mir die Frage peinlich...) Allllllerdings, ich glaube das Problem behebt sich selbsttätig. Ich muss einer anderen Funktion in der DLL einen Record übergeben, der jede Menge kram enthält, und der soll in der DLL-Funktion geändert/erweitern werden und dann wieder zum Mutterprogramm zurückgegeben werden.. Dafür brauch ich ShareMem, oder? Und wenn ja.. dann kann ich ja auch gleich Strings verwenden, ne? Muss ich irgendwas beachten wenn ich ShareMem einsetze? Dazu 2 Fragen: 1. Wie kann ich sicherstellen, das die für ShareMem benötigten Bibliotheken (welche DLL's sind das?) auch beim Anwender vorhanden sind? Beim Start des Programms aus einer Resource extrahieren hilft ja nicht, da die DLL's ja schon beim Start geladen werden.. 2. Wie muss ich den Record übergeben, damit er im Unterprogramm geändert werden kann und diese Werte auch erhalten bleiben? Normal mit
Delphi-Quellcode:
?? Oder gibts da irgendwas special-artiges?^^
function DLLs_nerven_irgendwie(var MyKnoten: TKnotenFeld): Integer;
Danke leute, BliZZarD |
Re: PChar to String & zurück - Zeichen geht verloren
ShareMem muss als erste Unit in der dpr-Datei stehen, und wenn du die Anwendung weitergibst, musst du die Borlandmm.dll mitgeben.
|
Re: PChar to String & zurück - Zeichen geht verloren
1: Ja über SetLength wird Speicher reserviert, damit funktioniert obiges Beispiel
2: Das hängt ganz von deinem Record ab, denn es keiner Größenveränderung bedarf, dann funktioniert dein Beispiel bereits (mit Var übergibst du im Prinzip einen Pointer auf dein Record). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 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