Mit Freepascal geschriebene DLL in Purebasic verwenden

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
dramag
Beiträge: 2
Registriert: 12.10.2004 23:41

Mit Freepascal geschriebene DLL in Purebasic verwenden

Beitrag von dramag »

Momentan experimentiere ich damit herum, in Freepascal eine DLL zu schreiben und deren Funktionen dann in Purebasic aufzurufen.
Es klappt auch problemlos, von Purebasic aus Variablen an die aufgerufene Funktion aus der DLL zu übergeben; ich hab allerdings ein Problem damit, daß die Funktion einen String nicht richtig zurückliefert.

Konkret:

Code: Alles auswählen

library hallotest;

function hallowelt(wasschreiben: pchar): pchar; export;
begin
  writeln(wasschreiben);
  hallowelt:='Ok, habs hingeschrieben';
end;

exports
  hallowelt;

end.
Das ist der Freepascal-Code, der die hallotest.dll erzeugt. Diese enthält die Funktion "hallowelt" welche einen pchar als Parameter erwartet, und diesen dann auf die Konsole ausgibt. Anschließend liefert die Funktion als Wert den pchar "Ok, habs hingeschrieben" zurück.

Nun der aufrufende Purebasic-Code:

Code: Alles auswählen

OpenConsole()

OpenLibrary (1,"hallotest.dll")
*rueckgabe.l = CallFunction (1, "hallowelt", "Hallo du da!")
CloseLibrary (1)

ConsoleLocate(1,2)
PrintN (PeekS(*rueckgabe.l))

Input()
CloseConsole()
Aus der hallotest.dll wird die Funktion "hallowelt" aufgerufen, und ihr der Parameter "Hallo du da!" übergeben (-> Klappt bei der Programmausführung ohne Probleme). Gleichzeitig wird der Pointer auf den Rückgabewert der Funktion (PChar mit dem Inhalt "Ok, habs hingeschrieben") in der Variablen "rueckgabe" gespeichert.
Nun sollte eigentlich der Cursor in der zweiten Zeile der Console platziert und dort der Inhalt des zurückgegebenen Strings ausgegeben werden, es tritt jedoch eine Schutzverletzung auf -> also müsste ja was mit der Pointeradresse nicht stimmen? Was genau hab ich falsch gemacht?
Xception
Beiträge: 16
Registriert: 16.09.2004 21:31

Beitrag von Xception »

es tritt jedoch eine Schutzverletzung auf -> also müsste ja was mit der Pointeradresse nicht stimmen? Was genau hab ich falsch gemacht?
Du hast kein Recht mehr auf die Adresse, wo der String gespeichert ist zuzugreifen, da du die dll vorher freigegebebn hast.
Benutze closelibrary am Ende des Programms oder zumindest nach

Code: Alles auswählen

PrintN (PeekS(*rueckgabe.l)) 
Ich hab kein freepascal, aber in Delphi muss man stdcall oder cdecl, und nicht export am Ende des Funktionskopfes schreiben.
export is für 16 bit dlls und wird in 32 bit dlls ignoriert.
Delphi's Standard Calling Convention ist register, wenn das in Freepascal genauso ist dann musst du export in stdcall ändern.
dramag
Beiträge: 2
Registriert: 12.10.2004 23:41

Beitrag von dramag »

Du hast kein Recht mehr auf die Adresse, wo der String gespeichert ist zuzugreifen, da du die dll vorher freigegebebn hast.
Benutze closelibrary am Ende des Programms oder zumindest nach

Code: Alles auswählen

PrintN (PeekS(*rueckgabe.l)) 
Habe closelibrary dahinter gesetzt und jetzt funktioniert es problemlos (am Pascal-Code musste ich nichts ändern).
Danke :)

Ich hab kein freepascal, aber in Delphi muss man stdcall oder cdecl, und nicht export am Ende des Funktionskopfes schreiben.
export is für 16 bit dlls und wird in 32 bit dlls ignoriert.
Delphi's Standard Calling Convention ist register, wenn das in Freepascal genauso ist dann musst du export in stdcall ändern.
In Freepascal ist es laut Doku so (falls ich das richtig verstanden habe): bei stdcall schreibt man hinter die Funktion generell nur "export;", bei cdecl kommt "cdecl; export;" dahinter. Das scheint auch bei 32bit zu gelten.
Antworten