Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PChar aus DLL übergeben (https://www.delphipraxis.net/143181-pchar-aus-dll-uebergeben.html)

Gargamel 11. Nov 2009 11:45


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:
interface

uses SysUtils;

function getText():PChar; cdecl; exports getText;

implementation

function getText():PChar;
var text:string;
Begin
   text:='Gargamel';
   result:=PChar(text);
End;
Die zweite DLL, die getText aufruft sieht so aus:

Delphi-Quellcode:
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;
Das Problem ist, daß die Variable back nur Unsinn behinhaltet. Wo ist der Fehler?

Luckie 11. Nov 2009 11:50

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 hier nachlesen.

himitsu 11. Nov 2009 11:54

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.

Luckie 11. Nov 2009 11:59

Re: PChar aus DLL übergeben
 
Zitat:

Zitat von himitsu
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.

Das kommt hinzu.

Der Text von meiner Seite bezieht sich zwar auf Strings, aber im Endeffekt läuft es auf das gleiche Problem hinaus.

Bernhard Geyer 11. Nov 2009 12:02

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.

Gargamel 11. Nov 2009 13:37

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?

alf.stefan 11. Nov 2009 14:26

Re: PChar aus DLL übergeben
 
die funktion wird doch so
Delphi-Quellcode:
function getText():PChar; cdecl; exports getText;
exportiert, und liefert müll! richtig?

und so wird die funktion eingebunden

Delphi-Quellcode:
function getText():PChar; external DLLName;
was ich hier vermisse ist das cdecl! ich kenn mich mit den aufrufkonventionen nicht sooo gut aus aber muss es nicht übereinstimmen?

@Gargamel Hast Du mal versucht die funktion auch mit cdecl einzubinden?

sirius 11. Nov 2009 14:26

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 16:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz