Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Pointerübergabe nur bei Prozeduren?? (https://www.delphipraxis.net/97878-pointeruebergabe-nur-bei-prozeduren.html)

TheMiller 17. Aug 2007 19:05


Pointerübergabe nur bei Prozeduren??
 
Hallo,

ich habe mal wieder ein Problem, welches so merkwürdig ist, dass ich es alleine nicht lösen kann. Es hört sich auch tierisch unbegreiflich an...

Also. Ich habe eine DLL und ein PlugIn. Das PlugIn eines Programms greift auf die DLL zu und und möchte eine Berechnung durchgeführt haben. Für diese Berechnung braucht die DLL ein paar Parameter - sowohl Strings, als auch Integers. Die DLL beinhaltet also eine Funktion, da sie ja was zurückgeben muss. Der wichtige Teil ist nicht die Berechnung, sondern der Teil, dass die Strings nicht ankommen. Ich mache das folgendermaßen:

Delphi-Quellcode:
DLL

function BerechneWas(Titel: PChar; Wert: Integer): Integer; stdcall;
begin
  ShowMessage(Titel);
  //Die Berechnung folgt.
end;


== Hauptprogramm ==

procedure OhneNamen;
begin
  Edit1.Text:='Ein schöner Titel';
  Edit2.Text:='25';
  Edit3.Text:=IntToStr(BerechneWas(PChar(Edit1.Text), IntToStr(Edit2.Text)));
end;
Was als Titel in der DLL ankommt, ist ein leerer String. Erstelle ich jetzt eine Prozedur mit Titel und übergebe den PChar an die DLL klappt das einwandtfrei.

Was mache ich falsch?

ACHSO: Das Showmessage in der DLL ist natürlich nur zu Debugging-Zwecken da. Aber die Funktion soll in Realität schon einen String/PChar empfangen.

Danke!

SirThornberry 17. Aug 2007 21:11

Re: Pointerübergabe nur bei Prozeduren??
 
also irgendwas stimmt nicht bei dem von dir geposteten Code.

in der DLL erwartet die Funktion einen PChar und einen Integer:
Delphi-Quellcode:
function BerechneWas(Titel: PChar; Wert: Integer): Integer; stdcall;
du übergibst aber einen PChar und einen String
Delphi-Quellcode:
BerechneWas(PChar(Edit1.Text), IntToStr(Edit2.Text))

3_of_8 17. Aug 2007 21:38

Re: Pointerübergabe nur bei Prozeduren??
 
IntToStr mit nem String (Edit2.Text) aufrufen geht ja sowieso mal nicht - ich vermute, er meinte StrToInt.

TheMiller 18. Aug 2007 10:33

Re: Pointerübergabe nur bei Prozeduren??
 
Richtig. Ich meinte auch StrToInt.

sirius 18. Aug 2007 10:37

Re: Pointerübergabe nur bei Prozeduren??
 
Hast du auch im Hauptprogramm die Funktion als stdcall definiert?

Apollonius 18. Aug 2007 10:38

Re: Pointerübergabe nur bei Prozeduren??
 
Importierst du statisch oder dynamisch? Der Fehler sieht fast nach falscher Aufrufkonvention aus...

TheMiller 18. Aug 2007 13:18

Re: Pointerübergabe nur bei Prozeduren??
 
Im Hauptprogramm habe ich diese Deklaration:

Delphi-Quellcode:
function BerechneWas(Titel: PChar; Wert: Integer): Integer; stdcall; Extarnal '.\Meine.dll';
Ist also im Plug-In statisch gelinkt!

Christian Seehase 18. Aug 2007 13:20

Re: Pointerübergabe nur bei Prozeduren??
 
Moin DJ-SPM,

das der Typecast

Delphi-Quellcode:
PChar(Edit.Text)
nicht unbedingt das gewünschte Ergebnis bringt, wenn man das dann an eine DLL als Parameter übergibt, hatte ich auch schon mal.
Probier mal

Delphi-Quellcode:
@Edit.Text[1]
ersatzweise.

TheMiller 18. Aug 2007 13:31

Re: Pointerübergabe nur bei Prozeduren??
 
Hm... hat leider auch nicht funktioniert.
Das Ergebnis ist immernoch ein Leerstring.

Habe es bei einer 2. Funktion probiert, die es auch gibt und fast genauso aufgebaut ist. Es kommt aber nur ein verstümmelter String wie "Ä)8 "()" raus, obwohl der gleiche Cast stattfindet.

sirius 18. Aug 2007 13:35

Re: Pointerübergabe nur bei Prozeduren??
 
.. und vorher in einen etxra String legen...

TheMiller 18. Aug 2007 13:48

Re: Pointerübergabe nur bei Prozeduren??
 
STOPP: Ich nehme alles zurück!

Die Lösung von Christian Seehase hat doch funktioniert. :bouncing4: :bounce1:

Vielen Dank.

Aber: Kann mir das jemand erklären?

Danke!

Christian Seehase 18. Aug 2007 14:01

Re: Pointerübergabe nur bei Prozeduren??
 
Moin DJ-SPM,

Zitat:

Zitat von DJ-SPM
STOPP: Ich nehme alles zurück!

Die Lösung von Christian Seehase hat doch funktioniert. :bouncing4: :bounce1:

Vielen Dank.

Bitte gerne. :-D

Zitat:

Zitat von DJ-SPM
Aber: Kann mir das jemand erklären?

Danke!

Wenn ich mich recht entsinne, konnte das damals auch Olli nicht erklären (was mich ja irgendwie auch beruhigt hat ;-))

Es muss was damit zu tun haben, wie Delphi intern den Datentyp der Eigenschaft Text handelt, denn es ist ja nur indirekt ein string, bei dem ein Cast auf PChar wie erwartet funktioniert.

TheMiller 18. Aug 2007 14:05

Re: Pointerübergabe nur bei Prozeduren??
 
Ok,

dann bin ich jetzt auch beruhigt. Ich nehme es so hin und vergessen werde ich das bestimmt auch nicht mehr.

Schönes Wochenende!

Muetze1 18. Aug 2007 17:43

Re: Pointerübergabe nur bei Prozeduren??
 
Ich möchte hiermit noch darauf hinweisen, dass der Code von Christian bei einem Leerstring auf eine ungültige Adresse zugreift und übergibt und bei eingeschaltetem BoundsCheck wird auch eine ERangeCheckError Exception ausgelöst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 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