Mit Freepascal geschriebene DLL in Purebasic verwenden
Verfasst: 13.10.2004 00:08
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:
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:
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?
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.
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()
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?