Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL: Übergabe von Stringwerten .. (https://www.delphipraxis.net/2195-dll-uebergabe-von-stringwerten.html)

erniepb 11. Jan 2003 20:28


DLL: Übergabe von Stringwerten ..
 
Hi .. Also folgendes Problem: ich hab ne Funktion in einer DLL an die ein PChar übergeben wird (wollte halt das mit der ShareMem-unit umgehen) naja wenn ich dann jetzt ein die Funktion aufrufe mit irgendeinem PChar, das aber irgendwo ein ^ enthält .. dann gibts jedes Mal ne Laufzeit-Fehlermeldung das an diversen Speicheradressen nich zugegriffen werden konnte .. liegt das daran dass ^ halt allgemein für Zeiger verwendet wird und PChar letztendlich Zeiger sind ??

Kann mir da vielleicht jemand ne kluge Idee zukommen lassen ?? wär echtr toll .. Danke ERniePB

Christian Seehase 11. Jan 2003 21:17

Moin Ernie,

das ^ ist nur für den Compiler im Zusammenhang mit Pointern von interesse.

Der Fehler muss von woanders kommen.

Wie ist die Funktion in der DLL deklariert?
Wie wird die Funktion im Programm importiert?
Wie wird die Funktion aufgerufen?
Wie wird die Variable die übergeben wird deklariert?
Wie wird die Variable die übergeben wird initialisiert?

So, ich glaub' das war's im Wesentlichen ;-)

erniepb 11. Jan 2003 21:48

Wie ist die Funktion in der DLL deklariert?

Code:
function Calculate(TransEquation: PChar; Angle : TAngleMode): TMyExtended;
und veröffentlicht mit:
Code:
exports
 Calculate;
Wie wird die Funktion im Programm importiert?

Code:
function Calculate(equation : PChar; Angle : TAngleMode): TMyExtended; external 'CalculationDLL.dll';
Wie wird die Funktion aufgerufen?
Wie wird die Variable die übergeben wird deklariert?
Wie wird die Variable die übergeben wird initialisiert?

Code:
procedure TForm1.Button1Click(Sender: TObject);
 var
  Ergebnis : TMyExtended;
 begin
  Ergebnis := Calculate(PChar(Edit1.Text),RAD);

  If Ergebnis.Defined = True Then
   Edit2.Text := FloatToStr(Ergebnis.Value)
  Else Edit2.Text := 'DNE';
 end;

und TMyExtended ist:
Code:
  TMyExtended = record
                 Defined : Boolean;
                 Value : Extended;
                end;



PS. Aber diese Fehlermeldung kommt immer nur wenn ^ in dem übergebenen PChar enthalten ist .. naja und der Fehler tritt auf bevor überhaupt die erste Zeile der Funktion Calculate bearbeitet wird .. heißt da muss dann ja irgenwie was bei der übergabe falsch laufen oder .. weil wenn ohne ^ dann funktionierts ja .. *seufz*

Christian Seehase 11. Jan 2003 22:10

Moin Ernie,

also das versteh' ich jetzt allerdings nicht?

Ist nur eine Idee aber versuch mal:

Delphi-Quellcode:
var
  Ergebnis : TMyExtended;
  sWork   : string;

begin
  sWork   := Edit1.Text;
  Ergebnis := Calculate(@sWork[1],RAD);
  // Wenn das funktioniert
  Ergebnis := Calculate(@Edit1.Text[1],RAD);
  // Ansonsten
  Ergebnis := Calculate(PChar(sWork),RAD);
//...
Und setze auf jeden Fall mal einen Breakpoint auf Ergebnis, und schau Dir mal an, ob hier die Übergabe des Strings funktioniert hat, also sWork auch den ^ enthält.

Was mir gerade noch als Möglichkeit einfällt:

Delphi-Quellcode:
var
  Ergebnis : TMyExtended;
  pWork   : PChar;

begin
  pWork   := AllocMem(Length(Edit1.Text)+1);
  try
    pWork   := @Edit1.Text[1];
    Ergebnis := Calculate(pWork,RAD);
//...
  finally
    FreeMem(pWork,Length(Edit1.Text));
  end;

erniepb 11. Jan 2003 22:28

Hab mal eben ausprobiert ...

Mit
Code:
Ergebnis := Calculate(@sWork[1],RAD);
kommt es zu nem Stacküberlauf .. aber ohne ^ funktionierts ..

Bei
Code:
Ergebnis := Calculate(@Edit1.Text[1],RAD);
gibts genau das selbe und bei
Code:
Ergebnis := Calculate(PChar(sWork),RAD);
auch

und bei dem letzten sagt er mir auch bei ohne ^ : ungültige Zeigeroperation .. und nu ?????

Noch ne Idee ????????

Christian Seehase 11. Jan 2003 22:38

Moin Ernie,

ja, einen hab' ich noch ;-)

Auf den Aufruf (wie er ganz zu Beginn war) einen Breakpoint setzen, und dann mal mit Ctrl-Alt-C in's CPU Fenster wechseln, um zu sehen, wann er mit dem Fehler kommt.
Hier geht's dann wie üblich mit F7/F8.

Als eine der ersten Aufrufe müsste ein Call auf UniqueString erfolgen, wenn das (mit F8) funktioniert hat bleibt leider erst mal nur der Einzelschritt mit F7.

Erklären kann ich mir das irgendwie nicht so ganz.

Beim letzten Beispiel hab' ich Blödsinn gemacht, sorry :oops:

Delphi-Quellcode:
// Statt
  pWork := @Edit1.Text[1];
  // muss
  StrLCopy(pWork,@Edit1.Text[1],Length(Edit1.Text));
  // stehen
Obwohl ich mittlerweile nicht mehr daran glaube, dass da funktioniert..

erniepb 11. Jan 2003 22:49

ich hab echt gar keine ahnung warum aber .. mit dem letzten funktionierts .. hmm .. kann mir dann da vielleicht einer erklären was das ganze eigentlich wirklich macht ??

Christian Seehase 11. Jan 2003 22:57

Moin Ernie,

dass die letzte Variante funktioniert freut mich zwar, aber das WARUM kann ich irgendwie nicht so recht beantworten.

Im Prinzip entspricht meine zweite Variante der Deinen, und meine erste und dritte, die's ja nicht taten meiner vierten, die funktioniert :shock:

Es wird da ja nichts anderes gemacht, als der Speicher für den String reserviert, und dieser dann mit dem Inhalt von Edit1.Text gefüllt.

Eine Idee, was die Ursache sein könnte hätte ich noch.

Falls Du den Mut hast das noch mal zu probieren: ;-)

Statt

Delphi-Quellcode:
  sWork   := Edit1.Text;
  Ergebnis := Calculate(@sWork[1],RAD);
probier mal bitte

Delphi-Quellcode:
  sWork   := Edit1.Text+#00;
  Ergebnis := Calculate(@sWork[1],RAD);

erniepb 14. Jan 2003 20:12

DANKE Christian .. hab das letzte jetzt auch nochmal ausprobiert .. und das geht auch .. aber frag mich bitte bitte nicht warum das vorher nich so geklappt hat .. hab nich die geringste Ahnung .. egal !! nochmal ganz doll viel Danke !!!!


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