Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dynamisch DLLs einbinden & Objekte - Pointer-Problem (https://www.delphipraxis.net/16409-dynamisch-dlls-einbinden-objekte-pointer-problem.html)

IronEddie 16. Feb 2004 17:43


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?

Generalissimo 16. Feb 2004 18:04

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

IronEddie 16. Feb 2004 18:13

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
 
Zitat:

Zitat von Generalissimo
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

Ich will ja auch nicht die Objekte aus der DLL holen, ich will nur der DLL sagen "mach mal ein Objekt, hier hast du die parameter, gib mir die referenz als pointer zurück"...

neolithos 16. Feb 2004 18:27

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)

IronEddie 17. Feb 2004 00:03

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?

Generalissimo 17. Feb 2004 00:51

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem
 
Zitat:

Ich will ja auch nicht die Objekte aus der DLL holen, ich will nur der DLL sagen "mach mal ein Objekt, hier hast du die parameter, gib mir die referenz als pointer zurück"...
das klang vorhins ganz anders


Zitat:

Kann ich überhaupt komplexe Objekte in die DLL übergeben / herausbekommen?
probier mal das:

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:
// 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;
PS: normalerweise entwickelt man in so einem Fall eine Three-tier-Architektur in der im Application-Server der DB-
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

IronEddie 17. Feb 2004 14:59

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:
              @CreateEnv := FuncPtr;

              Fibu := CreateEnv;

              FuncPtr := nil;
so gehts ohne Probleme.

Ich will aber dem ding sagen welche transaktion er verwenden soll!

Hab ich was übersehen?

wie stehts mit den direktiven

Delphi-Quellcode:
stdcall;
register;
cdecl;
was haben die auf die speicherbelegung für einen einfluß?

ich dreh bald durch! :wall: :freak:

Generalissimo 17. Feb 2004 15:53

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

IronEddie 17. Feb 2004 16:00

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 02:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz