![]() |
PChar aus DLL übergeben
Ich habe zwei DLLs. In der einen ist eine Funktion, die ein PChar zurückliefert. Nur dummerweise empfängt die andere DLL nur Unsinn.
Der Code sieht so aus:
Delphi-Quellcode:
Die zweite DLL, die getText aufruft sieht so aus:
interface
uses SysUtils; function getText():PChar; cdecl; exports getText; implementation function getText():PChar; var text:string; Begin text:='Gargamel'; result:=PChar(text); End;
Delphi-Quellcode:
Das Problem ist, daß die Variable back nur Unsinn behinhaltet. Wo ist der Fehler?
interface
uses SysUtils; const DLLName = 'blabla.dll'; function getText():PChar; external DLLName; implementation procedure machmal(); var back_p:PChar; back:string; Begin back_p:=getText(); back:=StrPas(back_p); end; |
Re: PChar aus DLL übergeben
Ein PChar ist nur ein Zeiger auf Charakter-Array im Speicher, das sagt ja schon das "P" von PChar. Nur dummerweise benutzen deine DLLs zwei unterschiedliche Speichermanager, jede DLL seinen eignen. Den Rest kannst du
![]() |
Re: PChar aus DLL übergeben
Witzig ist, daß der Code, so wie er ist, zufällig funktionieren sollte, da der String "Text" auf eine Konstante zeigt.
Aber wie schon erwähnt, sowas geht in der Regel nicht und sollte daher anders gelöst werden. Also wenn du es schonmal umbaust, dann schau dir auch mal ganz genau die Aufrufkonventionen (cdecl) an! PS: Das Problem ist hier, daß Result auf Text zeigt, aber Text ist eine lokale Variable, welche bei Prozedurende freigegeben wird, also ist damit auch das, worauf Result zeigt, nicht mehr vorhanden. |
Re: PChar aus DLL übergeben
Zitat:
Der Text von meiner Seite bezieht sich zwar auf Strings, aber im Endeffekt läuft es auf das gleiche Problem hinaus. |
Re: PChar aus DLL übergeben
Am besten die Funktionen immer mit 2 Parametern übergeben: Ersten einen Zeiger auf einen Speicherbereich denn die Exe angefordert hat und die größe dieses Speicherbereiches. Die DLL kopiert dann ihren String nur in diesen Speicherbereich.
In Zeiten von Unicode ist es sinnvoll gleich PWidechars zu verwenden und festzulegen ob die Längenangabe Zeichen (1 Widechar = 2 Byte) oder Bytes angiebt. |
Re: PChar aus DLL übergeben
Aha, also muß ich beim ersten Funktionsaufruf die Länge ermitteln, dann Speicher Länge+1 anfordern (wegen nullterminierten Strings) und dann den Wert in den Buffer schreiben.
Soweit richtig? |
Re: PChar aus DLL übergeben
die funktion wird doch so
Delphi-Quellcode:
exportiert, und liefert müll! richtig?
function getText():PChar; cdecl; exports getText;
und so wird die funktion eingebunden
Delphi-Quellcode:
was ich hier vermisse ist das cdecl! ich kenn mich mit den aufrufkonventionen nicht sooo gut aus aber muss es nicht übereinstimmen?
function getText():PChar; external DLLName;
@Gargamel Hast Du mal versucht die funktion auch mit cdecl einzubinden? |
Re: PChar aus DLL übergeben
@Gargamel: ja
@Stefan: Das ist ein weiteres Problem (was aber nicht stört, wenn es nur einen 32bit-Rückgabeparameter gibt), die Konevntion sollten übereinstimmen (himi hat da schon drauf hingewiesen). Trotzdem wird es bei Übereinstimmung nicht funktionieren, wenn man die Speicherproblematik nicht beachtet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 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