Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Klassen in DLL (https://www.delphipraxis.net/120901-klassen-dll.html)

sirius 21. Sep 2008 13:16

Re: Klassen in DLL
 
Und was mache ich, wenn ich die DLL aus VB in meinem Delphi einbinden will?

EWeiss 21. Sep 2008 13:18

Re: Klassen in DLL
 
Zitat:

Zitat von sirius
Und was mache ich, wenn ich die DLL aus VB in meinem Delphi einbinden will?

Dann bindest du sie als verweis ein und fertig
Das geht mit C mit NET warum nicht auch mit Delphi
Notfalls mit LoadLibrary ;)

gruss Emil

Bernhard Geyer 21. Sep 2008 13:25

Re: Klassen in DLL
 
Zitat:

Zitat von EWeiss
Frage mich warum das in Delphi so kompliziert ist ein Klasse für den zugriff von außen zu instanzieren.

Mir runtimepackages hat man ähnliche einfachheit. Bei VB läuft alles über COM mit der bekannt/berüchtigten DLL/COM-Hölle. Seit XP ist das zwar einfacher da man per Side-By-Side Registrierung arbeiten kann, aber das Grundübel besteht immer noch.

EWeiss 21. Sep 2008 14:45

Re: Klassen in DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dann zeig mal ein Beispiel...
Nur Interesse halber hier ist meins ..
Extra klein ;) VB mit Delphi formatiert hehhehehe...
"Form Main"
Delphi-Quellcode:
Option Explicit

Dim objPerson As IPerson

Private Sub Create_Click()  
    On Error Resume Next

    objPerson = Nothing  
    Set objPerson = CreatePerson(cmbPerson.ListIndex)
    objPerson.GebDatum = CDate(Text1.Text)
    objPerson.Name = Text2.Text

    objPerson.Sprich  
End Sub

Private Sub Form_Load()
    cmbPerson.AddItem "Baby"
    cmbPerson.AddItem "Student"
    cmbPerson.ListIndex = 0   
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set objPerson = Nothing
End Sub
"Bas"
Delphi-Quellcode:
Option Explicit

Public Enum PersonType
   Baby = 0
   Student = 1
End Enum

Public Function CreatePerson(ByVal ptPerson As PersonType) As IPerson
                                 
    Select Case ptPerson
        Case Baby
            Dim objBaby As cBaby
            Set objBaby = New cBaby
            objBaby.WindelVoll
            Set CreatePerson = objBaby
        Case Student
            Dim objStudent As cStudent
            Set objStudent = New cStudent
            objStudent.Betrunken
            Set CreatePerson = objStudent
    End Select
   
End Function
Exe Fertig !

Die Interface Schnittstelle person ..
"Class"
Delphi-Quellcode:
Option Explicit

Public Property Let GebDatum(ByVal dNew As Date)
End Property

Public Property Get GebDatum() As Date
End Property

Public Property Let Name(ByVal sNew As String)
End Property

Public Property Get Name() As String
End Property

Public Function Sprich() As String
End Function
fertig.
Nun das Baby
Delphi-Quellcode:
Option Explicit

Implements IPerson

Private md_GebDate As Date
Private ms_Name   As String

Private Sub Class_Initialize()
    MsgBox "Baby geboren"
End Sub

Private Sub Class_Terminate()
    MsgBox "Baby 'zerstört' ;)"
End Sub

Private Property Get IPerson_GebDatum() As Date
    IPerson_GebDatum = md_GebDate
End Property

Private Property Let IPerson_GebDatum(ByVal RHS As Date)
    md_GebDate = RHS
End Property

Private Property Let IPerson_Name(ByVal RHS As String)
    ms_Name = RHS
End Property

Private Property Get IPerson_Name() As String
    IPerson_Name = ms_Name
End Property

Private Function IPerson_Sprich() As String
    MsgBox "Ich heisse " & ms_Name & " und bin am " & md_GebDate & " geboren worden"
End Function

//zur Demonstration, das diese Klasse die Vererbten Methoden und Attribute
//beinhaltet, aber auch spezifische Sachen, nur die Klasse betreffend
Public Function WindelVoll()
    MsgBox "Meine Windel is voll. Bitte einmal wechseln"
End Function
Baby als Plugin fertig
Student
Delphi-Quellcode:
Option Explicit

Implements IPerson

Private md_GebDate As Date
Private ms_Name   As String

Private Sub Class_Initialize()
    MsgBox "An der Uni eingeschrieben"
End Sub

Private Sub Class_Terminate()
    MsgBox "Verdammt. Schon wieder rausgeflogen"
End Sub

Private Property Get IPerson_GebDatum() As Date
    IPerson_GebDatum = md_GebDate
End Property

Private Property Let IPerson_GebDatum(ByVal RHS As Date)
    md_GebDate = RHS
End Property

Private Property Let IPerson_Name(ByVal RHS As String)
    ms_Name = RHS
End Property

Private Property Get IPerson_Name() As String
    IPerson_Name = ms_Name
End Property

Private Function IPerson_Sprich() As String
    MsgBox "Ich heisse " & ms_Name & " und bin am " & md_GebDate & " geboren worden"
End Function

//zur Demonstration, das diese Klasse die Vererbten Methoden und Attribute
//beinhaltet, aber auch spezifische Sachen, nur die Klasse betreffend
Public Function Betrunken()
    MsgBox "Boah war die letzte Party übel. Ich glaub ich kotz gleich"
End Function
fertig ...
Jetzt mach das in Delphi ein komplettes Interface mit Plugin support...
Ich behaupte das du mehr an Aufwand betreiben mußt und es so einfach in Delphi nicht geht !!!

gruss Emil

omata 21. Sep 2008 16:10

Re: Klassen in DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal mein Vorschlag...

EWeiss 21. Sep 2008 16:40

Re: Klassen in DLL
 
Zitat:

Zitat von omata
Hier mal mein Vorschlag...

Nicht schlecht aber auch nicht das gleiche ? ;)

Viel mehr Code keine eigenständige DLL in dem sinne wie ich es ausgeführt habe.
Baby und Student sind eigenständige Dll's quasi Plugins und können
unabhängig von deiner Exe erweitert werden zum bsp. noch nen Opa dazu.

Die von dir erstellten Klassen werden nicht von außerhalb angesprochen.
trotzdem fein gemacht..

gruss Emil

omata 21. Sep 2008 16:50

Re: Klassen in DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, neuer Vorschlag...

EWeiss 21. Sep 2008 17:01

Re: Klassen in DLL
 
Zitat:

Zitat von omata
Ok, neuer Vorschlag...

Na ja fast ;)
Schmeiß die unit BabyU.pas und StudentU.pas aus dem Exe Projekt raus dann stimmt es in etwa.
Wo ich drauf hinaus wollte ist das man unter Delphi einiges an Code mehr benötigt
und der aufbau nicht so simple ist wie in VB.

Und das hat sich ja bestätigt ;)

Die IPersonU ist Hauptsächlich dafür da das man unter VB alle eigenschafte (vererbungen) im Intelisense zur verfügung hat.
Nur so neben bei als Information.

gruss Emil

omata 21. Sep 2008 17:38

Re: Klassen in DLL
 
Zitat:

Zitat von EWeiss
Schmeiß die unit BabyU.pas und StudentU.pas aus dem Exe Projekt raus dann stimmt es in etwa.

Ja, genau die Überlegung hatte ich auch. Dann wurde mir allerdings etwas klar...

Wenn ich eine Anwendung habe, die eine DLL benutzt dann kann ich innerhalb der DLL den Code anpassen und erweitern. Neue Funktionen kann ich dabei auch hinzufügen. Allerdings kennt meine alte Anwendung die neuen Funktionen ja nicht. Wie auch, als sie entstand existierten diese ja nicht. Deshalb die Frage: Wie soll das in VB gehen? Etwas was ich nicht kenne kann ich nicht aufrufen. Deshalb ist es ok, wenn ich die beiden Units in der Anwendung kenne. Oder nicht?

Zitat:

Zitat von EWeiss
Wo ich drauf hinaus wollte ist das man unter Delphi einiges an Code mehr benötigt
und der aufbau nicht so simple ist wie in VB.

Und das hat sich ja bestätigt ;)

Also das sehe ich jetzt nicht so bestätigt. Wo habe ich den wesentlich mehr Code geschrieben?

EWeiss 21. Sep 2008 18:17

Re: Klassen in DLL
 
Zitat:

Wenn ich eine Anwendung habe, die eine DLL benutzt dann kann ich innerhalb der DLL den Code anpassen und erweitern. Neue Funktionen kann ich dabei auch hinzufügen. Allerdings kennt meine alte Anwendung die neuen Funktionen ja nicht. Wie auch, als sie entstand existierten diese ja nicht. Deshalb die Frage: Wie soll das in VB gehen? Etwas was ich nicht kenne kann ich nicht aufrufen. Deshalb ist es ok, wenn ich die beiden Units in der Anwendung kenne. Oder nicht?
Du kannst keine Unit's addieren die deiner anwendung nicht bekannt sind.
Baby.dll hat Emil geschrieben die Anwendung von Omata kennt diese aber nicht ..
Wie willst du sie dann addieren ?
Beide kennen wir nur das Interface IPersonU

Nein kannst du nicht!
Ein Plugin ist nur soweit erweiterbar wie die Class IPersonU das zuläßt
Alles darüber hinaus würde fehlschlagen da es in deiner Anwendung nicht verarbeitet wird.

Anwendung und DLL's sind abhängig vom Interface IPersonU
Willst du also neue Dinge hinzufügen geht das nur wenn diese von IPersonU
nach außen freigegeben werden und die neuen Funktionen bzw.. die geänderte Unit im jeweiligen Quelltext übernommen wird
also in jeder DLL und der anwendung aktualisiert wird.

Jedes Programm kann dann die IPersonU einbinden und mit deiner Anwendung kommunizieren. bzw.. die Plugins verwenden.

Zitat:

Also das sehe ich jetzt nicht so bestätigt. Wo habe ich den wesentlich mehr Code geschrieben?
Na ja wollen wir nicht so kleinlich sein. ;)

Meine komplette Anwendung kompiliert verwendet gepackt 22.5KB incl.. Source
Deine 1,2MB gut du hast die Runtime drin .. ohne Source
Auch habe ich keinerlei zusätzliche klassen einbinden müssen.

EDIT:
Auch das einbinden der IPersonU ist eigentlich nicht OK!
Diese ist nämlich ebenfalls eine eigenständige Datei(DLL) also ein Wrapper zwischen deiner Anwendung
und den Dll's welche sie verwenden du darfst also nur das interface von IPersonU einbinden nicht
die komplette Unit.

Interface schreibt PersonX
Ich die DLL und du die Anwendung.
Wird das interface geändert bekommt dieses eine neue GUID und du mußt
deine Anwenung daraufhin anpassen so wie ich meine DLL
Zitat:

Allerdings kennt meine alte Anwendung die neuen Funktionen ja nicht.
Nun kennt deine alte Anwendung die Funktionen auch. ;)

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr.
Seite 2 von 3     12 3      

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