AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Dynamisch DLLs einbinden & Objekte - Pointer-Problem
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisch DLLs einbinden & Objekte - Pointer-Problem

Ein Thema von IronEddie · begonnen am 16. Feb 2004 · letzter Beitrag vom 17. Feb 2004
Antwort Antwort
IronEddie

Registriert seit: 9. Okt 2002
13 Beiträge
 
#1

Dynamisch DLLs einbinden & Objekte - Pointer-Problem

  Alt 16. Feb 2004, 18:43
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?
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem

  Alt 16. Feb 2004, 19:04
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
  Mit Zitat antworten Zitat
IronEddie

Registriert seit: 9. Okt 2002
13 Beiträge
 
#3

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem

  Alt 16. Feb 2004, 19:13
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"...
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem

  Alt 16. Feb 2004, 19:27
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)
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
IronEddie

Registriert seit: 9. Okt 2002
13 Beiträge
 
#5

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem

  Alt 17. Feb 2004, 01:03
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?
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem

  Alt 17. Feb 2004, 01:51
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
  Mit Zitat antworten Zitat
IronEddie

Registriert seit: 9. Okt 2002
13 Beiträge
 
#7

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem

  Alt 17. Feb 2004, 15:59
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!
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem

  Alt 17. Feb 2004, 16:53
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
  Mit Zitat antworten Zitat
IronEddie

Registriert seit: 9. Okt 2002
13 Beiträge
 
#9

Re: Dynamisch DLLs einbinden & Objekte - Pointer-Problem

  Alt 17. Feb 2004, 17:00
Ja du Held, 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?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:32 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