![]() |
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-Quellcode:
// 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-Quellcode:
// 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? |
Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Hi,
ich meine mich zu erinnern, das man aus "normalen" DLL's keine Objekte exportieren kann. Dafür kann man entweder unter Delphi die Packages verwenden oder COM/DCOM/COM+ oder jetzt in der neuesten Version die NETEnterpriseServices |
Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Zitat:
|
Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Mittels Packages könnte man das sauberer Machen.
Da bräuchte man nicht auch Objecte verzichten. Und da ein Package eh eine DLL ist, geht GetProcAdress genauso. (Unterschied: Zum laden LoadPackage verwenden) |
Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Ok, packages hin oder her, das muß doch auch irgendwie mit der DLL gehen...
Keiner eine Ahnung? Wie machen das z.B. die leutz von nullsoft mit ihren Winamp-Plugins? |
Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Zitat:
Zitat:
Delphi-Quellcode:
// Routine in der DLL
(...) var Fibu : TFibustamm; (...) function CreateEnvironment(aTransaction : TIBTransaction; aStammdaten : TStammdaten) :TFibuStamm; //man kann doch die Objekte direkt übergeben (aTransaction:[b]TIBTransaction[/b]). Sie werden doch sowieso als Pointer übergeben, soviel ich weiss begin Fibu := TAddison.Create(nil, aStammdaten, aTransaction); Result := Fibu; end;
Delphi-Quellcode:
PS: normalerweise entwickelt man in so einem Fall eine Three-tier-Architektur in der im Application-Server der DB-
// Ausschnitt Hauptprogramm
uses Objekt_Unit_TFibustamm; type TCreateEnv = function (aTransaction : TIBTransaction; aStammdaten : TStammdaten) :TFibuStamm; private Fibu:TFibuStamm; CreateEnv:TCreateEnv; CreateEnv := GetProcAddress(FibuDLLHandle, PChar('CreateEnvironment')); if not Assigned(CreateEnv) then begin ManBuchhaltung.Enabled := false; ParadoxFound := false; FrmMessageWindow.MessageAn('Fibu-Datenbank nicht aktiv'); end else begin Fibu := CreateEnv(DM.IBT, Stammdaten); end; Zugriff gekapselt ist. Dort meist der Einsatz von COM/DCOM. Dort ist ADO schön, da dort das Recordset in Binärform übertragen wird und Windows alles umwandelt. Oh je werde Off-Topic |
Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Also das Problem liegt tatsächlich daran das die DLL nicht richtig auf die Parameter zugreift.
Delphi-Quellcode:
so gehts ohne Probleme.
@CreateEnv := FuncPtr;
Fibu := CreateEnv; FuncPtr := nil; Ich will aber dem ding sagen welche transaktion er verwenden soll! Hab ich was übersehen? wie stehts mit den direktiven
Delphi-Quellcode:
was haben die auf die speicherbelegung für einen einfluß?
stdcall;
register; cdecl; ich dreh bald durch! :wall: :freak: |
Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Siehe OH:
Code:
Direktive Parameterreihenfolge Bereinigung Parameterübergabe in Registern?
register Von links nach rechts Routine Ja pascal Von links nach rechts Routine Nein cdecl Von rechts nach links Aufrufer Nein stdcall Von rechts nach links Routine Nein safecall Von rechts nach links Routine Nein |
Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Ja du Held, :idea: das hab ich auch gefunden...
Aber was das im konkreten Fall bedeutet würd ich gern ma wissen... Brauch ich eine solche direktive oder nicht? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz