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:
// Routine in der DLL 

(...) 
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:
// Ausschnitt Hauptprogramm 

          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); // <- hier schebbertz 
              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ß.