Autor Beitrag
IronEddie
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 16.02.04 19:02 
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...

ausblenden 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;



ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Mo 16.02.04 20:44 
du solltest die Routine(n) der DLL exportieren. Ansonsten gehts nicht.
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
IronEddie Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: Di 17.02.04 08:02 
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 17.02.04 15:23 
AAAACH? EHRLICH?

Hast wohl bisher mit DLLs nix am hut gehabt?

Gruß.