Ich habe eine selbst geschriebene Lib, die z.B so aussieht:
Code:
library testlib;
{$IFDEF FPC}
{$mode Delphi}{$H+}
{$ENDIF}
uses cmem;
function plus(a, b:Integer):Integer;stdcall;
begin
result := a+b;
end;
exports plus;
begin
end.
Mein Hauptprogramm sieht zum Beispiel so aus:
Code:
program tut1;
{$IFDEF FPC}
{$MODE Delphi}{$H+}
{$ENDIF}
function plus(a, b:Integer):Integer;stdcall;external'libtestlib.so';
var
i:Integer;
begin
i := plus(1,2);
end.
Mit anderen Worten, das Einfachste, das so geht.
Das Problem ist jetzt folgendes: So wie oben funktioniert es einwandfrei. Binde ich jetzt aber z.B dglOpenGL (unbenutzt) ein, dann bekomme ich häufig unzählige AVs an Addresse 0 und zum Abschluss eine Exception bei einer anderen Addresse. Ein ähnliches Bild gibt es, wenn ich z.B den SDL Header einbinde.
TAK tippt auf einen Compilerbug (benutze FPC 2.2.0). Ich hoffe mal, dass dem nicht so ist und jemand ne Lösung kennt, obwohl ich zugegebenermaßen keine Ahnung hab, was man hier ändern sollte...
Gruß
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Überprüfe mal bitte folgende Dinge.
1. Align muss sowohl in der Anwendung als auch in der DLL aktiv sein. Sonst können die komischsten Dinge passieren.
2. keine Dinge im Initialization und Finalization. Das Initialization wird unter Linux nicht unterstützt.
Außerdem. Muss du natürlich die dglOpenGL auch initialisieren und die Funktionspointer laden. Also sowohl im Program als auch in der DLL. Und damit du die Funktionspointer in der DLL laden kannst muss natürlich schon ein Kontext erstellt und aktiviert worden sein.
Überprüfe mal bitte folgende Dinge. 1. Align muss sowohl in der Anwendung als auch in der DLL aktiv sein. Sonst können die komischsten Dinge passieren. 2. keine Dinge im Initialization und Finalization. Das Initialization wird unter Linux nicht unterstützt.
Außerdem. Muss du natürlich die dglOpenGL auch initialisieren und die Funktionspointer laden. Also sowohl im Program als auch in der DLL. Und damit du die Funktionspointer in der DLL laden kannst muss natürlich schon ein Kontext erstellt und aktiviert worden sein.
zu 1: Align?
zu den anderen:
Soweit muss man garnicht erst gehen. Wenn ich in exakt obigen Code im Programm dglOpenGL in die Uses-Klausel setze, bekomme ich hunderte Exceptions. Was ich bisher weiß ist, dass sie offenbar am Programmende beim Heap Aufräumen auftreten.
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Align: Du kannst die das Align für die Recordfelder angeben. Also dann würden Records immer ein Vielfaches von 1, 2, 4 oder 8 Bytes benutzen. (Delphi Werte). Und bei DLL muss dieser Wert mindestens 4 sein. Tak hatte da auch schon mal was, dass eine DLL gar nicht erst geladen werden konnte wo das Align nicht angegeben wurde. Aber eigentlich sollte das per default auf 4 oder 8 stehen. Und deiner Frage nach zu urteilen setzt du es nicht also wird es auch nicht explizit entfernt.
Was macht denn die Unit cmem?
Sonst wüsste ich so aber auch nicht was es sein könnte/sollte
Align: Du kannst die das Align für die Recordfelder angeben. Also dann würden Records immer ein Vielfaches von 1, 2, 4 oder 8 Bytes benutzen. (Delphi Werte). Und bei DLL muss dieser Wert mindestens 4 sein. Tak hatte da auch schon mal was, dass eine DLL gar nicht erst geladen werden konnte wo das Align nicht angegeben wurde. Aber eigentlich sollte das per default auf 4 oder 8 stehen. Und deiner Frage nach zu urteilen setzt du es nicht also wird es auch nicht explizit entfernt.
Was macht denn die Unit cmem?
Sonst wüsste ich so aber auch nicht was es sein könnte/sollte
Also kann das mit dem Align ja schonmal niocht sein, weil ich keine Records im Bsp. drin hab. cmem ist, soweit ich das verstanden habe, das Pendant zu ShareMem, stellt also im Initialization irgendwas an der Speicherbeschaffung um, damits keine Fehler dabei gibt.
Ich denke mal, ich bringe die FB-Lib nach C++. Ich sag mal es funktioniert zwar, aber schön sind die Exceptions am Schluss nicht.
/edt:
So schnell können sich Meinungen ändern... Ich werde einen Bugreport machen und erstmal bei Standard-Delphi bleiben. Ich werde den Code einer Library anbieten, die die Klassen wrappt. Unter Windows mit Delphi funktionierts ja denke ich mal, unter Linux und anderen bleibts dann eben erstmal auf FPC beschränkt, bis es funktioniert. Das letzte, was ich im Moment habe, ist Zeit mich mit Lib-Programmierung mit C++ zu beschäftigen, zumal ich im Endeffekt nichtmal weiß, ob es Plattformunabhängig ist.
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ahm. CMem ist doch dieser Memory-Manager, der dieses Delphi-Dingens da ersetzen soll, oder?
Dann muss der in allen eingebundenen DLLs verwendet werden, was bei dglOpenGL natürlich nicht der Fall ist. Deshalb kommt es da schon beim Einbinden zum Stress.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.