![]() |
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 |
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 ;-) |
Wie ist die Funktion in der DLL deklariert?
Code:
und veröffentlicht mit:
function Calculate(TransEquation: PChar; Angle : TAngleMode): TMyExtended;
Code:
Wie wird die Funktion im Programm importiert?
exports
Calculate;
Code:
Wie wird die Funktion aufgerufen?
function Calculate(equation : PChar; Angle : TAngleMode): TMyExtended; external 'CalculationDLL.dll';
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* |
Moin Ernie,
also das versteh' ich jetzt allerdings nicht? Ist nur eine Idee aber versuch mal:
Delphi-Quellcode:
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.
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); //... 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; |
Hab mal eben ausprobiert ...
Mit
Code:
kommt es zu nem Stacküberlauf .. aber ohne ^ funktionierts ..
Ergebnis := Calculate(@sWork[1],RAD);
Bei
Code:
gibts genau das selbe und bei
Ergebnis := Calculate(@Edit1.Text[1],RAD);
Code:
auch
Ergebnis := Calculate(PChar(sWork),RAD);
und bei dem letzten sagt er mir auch bei ohne ^ : ungültige Zeigeroperation .. und nu ????? Noch ne Idee ???????? |
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:
Obwohl ich mittlerweile nicht mehr daran glaube, dass da funktioniert..
// Statt
pWork := @Edit1.Text[1]; // muss StrLCopy(pWork,@Edit1.Text[1],Length(Edit1.Text)); // stehen |
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 ??
|
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:
probier mal bitte
sWork := Edit1.Text;
Ergebnis := Calculate(@sWork[1],RAD);
Delphi-Quellcode:
sWork := Edit1.Text+#00;
Ergebnis := Calculate(@sWork[1],RAD); |
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 20:26 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