Entwickler-Ecke
Windows API - Dynamisch DLLs einbinden & Objekte - Pointer-Problem
IronEddie - Mo 16.02.04 19:02
Titel: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Ich habe folgendes Problem:
Ich kapsel in DLLs Nachfahren einer Klasse, die ich dann dynamisch in meinem Hauptprogramm laden kann (Exportroutinen für Daten aus einer IB-Datenbank).
Im Hauptprogramm liegt eine Variable der Stammklasse vor. Ich lade mir dann die gewünschte DLL, welche eine Methode hat, die "ihr" Export-Objekt erzeugt und zurück gibt...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| (...) var Fibu : TFibustamm; (...)
function CreateEnvironment(aTransaction : Pointer; aStammdaten : pointer) : pointer; begin
Transaction := TIBTransaction(aTransaction); Stammdaten := TStammdaten(aStammdaten);
Fibu := TAddison.Create(nil, Stammdaten, Transaction); Result := Fibu;
end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| FuncPtr := GetProcAddress(FibuDLLHandle, PChar('CreateEnvironment'));
if FuncPtr = nil then begin ManBuchhaltung.Enabled := false; ParadoxFound := false; FrmMessageWindow.MessageAn('Fibu-Datenbank nicht aktiv'); end else begin @CreateEnv := FuncPtr; Fibu := CreateEnv(DM.IBT, Stammdaten); FuncPtr := nil; end; |
An der angegebenen stelle tritt ein Fehler auf: Lesen von Adresse $0
Ich vermute das die Eigenschaften und Parameter der Objekte nicht korrekt zur routine aus der DLL wandern... Kann ich überhaupt komplexe Objekte in die DLL übergeben / herausbekommen?
Was mache ich Falsch?
MSCH - Mo 16.02.04 20:44
du solltest die Routine(n) der DLL exportieren. Ansonsten gehts nicht.
grez
msch
IronEddie - Di 17.02.04 01:35
Das is schon klar...
die routine ist bei "exports" angegeben...
Ich kann diese unter weiteren anderen routinen auch aufrufen - die anderen routinen funktionieren indes ohne probleme (rückgabewerte sind primitive datentypen)
ich bekomme aber Speicherzugriffsfehler beim zugriff z.B. auf das übergebene Interbase-transaktions-objekt.
fhlen bei der deklaration eventuell direktiven?
stdcall oder cdecl oder register?
es hat wohl was mit der speicherzuordnung zu tun oder?
KidPaddle - Di 17.02.04 08:02
Delphi-Quelltext
1:
| @CreateEnv := FuncPtr; |
Du weist, das Du hier die Adresse der Variable CreateEnv verändert und nicht den Wert der Variable CreateEnv, oder?
Gruß
KidPaddle
IronEddie - Di 17.02.04 15:23
AAAACH? EHRLICH?
Hast wohl bisher mit DLLs nix am hut gehabt?
Gruß.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!