AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

DLL und Objektübergabe

Ein Thema von Igotcha · begonnen am 6. Feb 2005 · letzter Beitrag vom 7. Feb 2005
Antwort Antwort
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#1

DLL und Objektübergabe

  Alt 6. Feb 2005, 11:13
Hallo zusammen,

ich bastle gerade an einem Anwendungs-"Framework" mit einem Hauptprogramm und in DLLs ausgelagerten Forms mit datensensitiven Komponenten. Über die bisher erzielten Ergebnisse bin ich selbst positiv überrascht habe allerdings eine Lösungsanfrage zu folgendem Problem:

Das aufrufende Hauptprogramm übergibt der DLL beim Aufruf ein TDLLIN-Objekt mit Informationen über die Anwendung, die DLL liefert an das Hauptprogramm ein TDLLOUT-Objekt mit Informationen über die DLL - das funktioniert soweit aus sehr gut.

Die beiden Klassen sind in einer vom Hauptprogramm und den DLLs gemeinsam genutzen Unit deklariert:

Delphi-Quellcode:
type
  TDLLIN = class
    private
      FApplication: String;
      FZConnection: TZConnection;
      FUserID: integer;
      procedure SetApp(aApplication: string);
      procedure SetZCon(aZConnection: TZConnection);
      procedure SetUser(aUserID: integer);
    public
      property Application: string read FApplication write SetApp;
      property Connection: TZConnection read FZConnection write SetZCon;
      property UserID: integer read FUserID write SetUser;
end;

type
  TDLLOUT = class
    private
      FDBForm: TForm;
      FDBID: integer;
    procedure SetDBID(aDBID: integer);
    procedure SetDBForm(aForm: TForm);
    public
      property DBForm: TForm read FDBForm write SetDBForm;
      property DBID: integer read FDBID write SetDBID;
end;

var
  myDLLOUT: TDLLOUT;
Die DLLs bestehen immer aus der Projekt und einer Form-Unit. Die Aufruffunktion einer DLL lautet:

function ShowWindow(aForm: TForm; aPanel: TPanel; aDLLIN: TDLLIN): TDLLOUT; Im Hauptprogramm rufe ich diese in dynamischer Variante wie folgt auf:

myDLLOUT:=ShowWindow(frmMain, Panel1, myDLLIN); und zeige sie dann an:

myDLLOUT.DBForm.Show; Bis hierher funktioniert alles wunderbar.

Jetzt möchte ich allerdings zusätzlich haben, dass z.B. bei einem Doppelklick auf ein DBGrid in der DLL-Form dem Hauptprogramm der Datensatz bekannt gemacht wird:

Delphi-Quellcode:
procedure TfrmForm.DBGrid1DblClick(Sender: TObject);
begin
    PC1.ActivePageIndex:=2;
    myDLLOUT.DBID:=DBGrid1.Fields[0].asinteger;
end;
Nur greift das offensichtlich nicht auf das übergebene Object im Hauptprogramm durch, denn das Objekt DLLOUT wird ja in der DLL erstellt und in diesem initialisierten Zustand einmalig an das Hauptprogramm übergeben.

Delphi-Quellcode:
function ShowWindow(aForm: TForm; aPanel: TPanel; aDLLIN: TDLLIN): TDLLOUT;
begin
  if not Assigned(Form) then
    Form:=TfrmForm.Createparented(aPanel.handle);

  Form.ZTable1.Connection:=aDLLIN.Connection;
  Form.ZTable1.TableName:='testdaten';
  form.ZTable1.Active:=true;
  form.BorderStyle:=bsnone;
  Form.SB1.SimpleText:=aDLLIN.Application;
  // DLLOUT-Object erstellen
  myDLLOUT:=TDLLOUT.Create;
  myDLLOUT.DBForm:=Form;
  myDLLOUT.DBID:=-1;
  // =========================================================
  Result:=myDLLOUT;
end;
Wie kann ich es nun erreichen, dass sich Ereignisse in der DLL, die Properties des TDLLOUT-Objekts betreffen, sich auf das von der DLL an das Hauptprogramm übergebene DLLOUT-Objekt auswirken?

Gruß Igotcha
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: DLL und Objektübergabe

  Alt 7. Feb 2005, 15:22
Zitat von Igotcha:
ich bastle gerade an einem Anwendungs-"Framework" mit einem Hauptprogramm und in DLLs ausgelagerten Forms mit datensensitiven Komponenten.
Also ist alles in deiner DLL sehr Delphi spezifisch und kann nur von Delphi Anwendungen genutzt werden ?!
Dann wirst du mit einem dynamisch geladenen Package viel glücklicher werden.
http://www.obsof.com/delphi_tips/DL613.html
Wenn du dein "Framework" unabhängig von Delphi halten möchtest, dann musst du dich mit COM/DCOM/ActiveX anfreunden.

Ein "normale" DLL ist eine Sackgasse, da du nicht wirklich objektorientiert arbeiten kannst.
Andreas
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#3

Re: DLL und Objektübergabe

  Alt 7. Feb 2005, 16:21
Oh mann, vergesst mal ganz schnell meine Frage

Ich war durch meine ersten tieferen Schritte in die OOP- und DLL-Programmierung so positiv angetan, dass ich mich wundere, warum der besagte Property-Wert, den ich zum Debuggen in die Statusbar geschrieben habe, nicht dort auch automatisch aktualisiert wird, wenn die Property geändert wird

Selbstverständlich funktioniert es wie gewünscht, ich hätte mir nur mal den tatsächlich aktuellen Wert auch anzeigen lassen müsssen hehe

Sorry für die Verwirrung...

Gruß Igotcha
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: DLL und Objektübergabe

  Alt 7. Feb 2005, 16:29
Zitat von Igotcha:
Delphi-spezifisch ist in diesem Fall schon ok.

Ich versuche meine Frage auf den Kern zu reduzieren:

- ein Objekt-Typ ist dem Hauptprogramm und der DLL in einer gemeinsamen Unit bekannt
-> TDLLOUT mit
myDLLOUT: TDLLOUT;
Dann gibt es im Hauptprogramm und in der DLL diese Variable myDLLOUT!!
Das Hauptprogramm und die DLL haben jeweils 4 Bytes für die Variable reserviert.
Du hast es also mit 2 Variablen zu tun!!
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: DLL und Objektübergabe

  Alt 7. Feb 2005, 16:32
Können in einer DLL überhaupt Objekte aus dem Hauptprogramm bearbeitet werden?
Ich denke man muss in dem Fall ne Speicheradresse übergeben, auf die dann die DLL das Objekt schreibt um es dann im Hauptprogramm von da wieder einzulesen...

Oder seh ich das falsch?
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#6

Re: DLL und Objektübergabe

  Alt 7. Feb 2005, 16:34
Siehe mein geändertes Posting

Es funktioniert soooo gut, dass ich es nicht bemerkt hatte
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

Re: DLL und Objektübergabe

  Alt 7. Feb 2005, 17:46
Das Problem ist die Speicherverwaltung. Das trifft nicht nur Strings sondern auch Objekte.
Objektorientierung in einer Schnittstelle nur ueber Interfaces. Einfache Funktionen sind viel besser.
Versuch mal eine C++ Plugin-Schnittstelle von Delphi aus zuzugreifen.
ActiveX/COM wuerde ich erst mal meiden, da sie Windows-spezifisch sind.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:10 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