AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PChar aus DLL übergeben

Ein Thema von Gargamel · begonnen am 11. Nov 2009 · letzter Beitrag vom 11. Nov 2009
Antwort Antwort
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#1

PChar aus DLL übergeben

  Alt 11. Nov 2009, 12:45
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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: PChar aus DLL übergeben

  Alt 11. Nov 2009, 12:50
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#3

Re: PChar aus DLL übergeben

  Alt 11. Nov 2009, 12:54
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: PChar aus DLL übergeben

  Alt 11. Nov 2009, 12:59
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: PChar aus DLL übergeben

  Alt 11. Nov 2009, 13:02
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#6

Re: PChar aus DLL übergeben

  Alt 11. Nov 2009, 14:37
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?
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#7

Re: PChar aus DLL übergeben

  Alt 11. Nov 2009, 15:26
die funktion wird doch so
function getText():PChar; cdecl; exports getText; exportiert, und liefert müll! richtig?

und so wird die funktion eingebunden

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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: PChar aus DLL übergeben

  Alt 11. Nov 2009, 15:26
@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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:35 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