Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointerfehler in DLL (https://www.delphipraxis.net/57504-pointerfehler-dll.html)

JocalAreaNetwork 22. Nov 2005 12:06


Pointerfehler in DLL
 
Hallo,

ich habe jetzt mehrere Stunden an einer 'Invalid Pointer Operation' gehockt und weiß einfach nicht, was hier schiefläuft.
Die Funktion, die den Fehler wirft, sieht so aus:
Delphi-Quellcode:
function UnparseExpression(expression:string;varstack:ttempstack):string; stdcall;
var
  start,len,insertid:integer;
  dummy:string;
begin
  // now reparse the stinking thing ;)
  start := Pos('$', expression);
  while ( start > 0 ) do begin
    len := start+1;
    while ( partofint(expression[len+1]) ) do
      inc(len);

    dummy := copy(expression, start+1, len-start);
    insertid := strtoint(dummy);
    delete(expression, start,len-start+1);
    dummy := 'a'; // < hier entsteht schon ein fehler, auskommentiert läuft es
    //insert(floattostr(round(varstack.Entry[insertid]*precision_number)/precision_number), expression, start);

    start := Pos('$', expression);
  end;
  result := expression;
end;
Diese Methode steht in meiner DLL, auch wenn sie nicht exportiert wird. Sie wird von einer anderen Funktion in der DLL aufgerufen. Aus mir unerklärlichen Gründen wirft Delphi nun ein 'Invalid Pointer Operation' aus nachdem die Funktion beendet ist. Kommentiere ich die Zeile dummy:='a'; aus, dann tut es das nicht. Ich kann ansonsten an anderen Stellen Strings Werte zuweisen und diese auch wieder abrufen - warum hier nicht?

Wäre super, wenn mir jemand helfen könnte.

Mit freundlichen Grüßen
JocalAreaNetwork


PS: Ich glaube es tut zwar nichts zur Sache, aber ich lade die DLL dynamisch. PartOfInt() ist eine eigene Funktion, die nichts großartiges macht außer zu überprüfen, ob der Char eine Zahl ist.

rochus 22. Nov 2005 12:16

Re: Pointerfehler in DLL
 
Hallo,
Lies dir mal den dicken Kommentarblock in deiner <DLLName>.dpr. Dort steht was von wegen "ShareMM". Damit du Daten vom Typ String (Und sei es auch nur irgendein Feld einer Klasse/Unterklasse, sonst was) mit DLLs austauschen kannst, muss der Speichermanager zwischen DLL und Hauptanwendung "geteilt" benutzt werden -> Entweder du nutzt ShareMM von Borland, dann musst du aber die brlndmm.dll mitliefern, oder du nutzt andere Lösungen wie etwa FastShareMem oder FastMM

Gruß

JocalAreaNetwork 22. Nov 2005 12:25

Re: Pointerfehler in DLL
 
Hi, super. :)

Damit wären diese Invalid Pointer Operations schon weg. :)

Wenn ich jedoch jetzt das Hauptprogramm beende, dann kommt ein Runtime Error 217 at 00414154. Hast du vielleicht für den noch eine Erklärung? :/


Vielen Dank schonmal.
JocalAreaNetwork

Edit: Ah, hatte ShareMem in einer Unit vergessen. Nun funktioniert alles, vielen Dank nochmal. :)


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