Modul BaseClass ClassDispatch inklusive ClassFactory

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Modul BaseClass ClassDispatch inklusive ClassFactory

Beitrag von mk-soft »

Mit "QueryInterface" kann man ein neues Object über die IID anlegen. Dazu muss die IID für das Object registriert sein oder bei nicht registrieren IID dem aufrufenden Programm bekannt sein.
Im QuerInterface muss natürlich die IID ausgewertet werden welches Object gemeint ist und das Object erstellen.

P.S.
Update v1.24
- Bugfix und Erweiterung Defined Properties
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Modul BaseClass ClassDispatch inklusive ClassFactory

Beitrag von GPI »

ich hab gerade nochmal bei QueryInterface nachgelesen.
Bei dir dürfte man es machen. Wenn man ein QueryInterface von ein IDispatch macht und ein IIrgendwas bekommt, dann muss ein Querinterface von IIrgendwas mti IDispatch das "Vorherige" QueryInterface zurückgeben. Das ist bei dir gegeben.
Bei mir leider nicht, weil ich quasi ein neues Objekt hab und das ist dann nicht erlaubt, außer es "verbinden" sich quasi zurück.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Modul BaseClass ClassDispatch inklusive ClassFactory

Beitrag von mk-soft »

Update v1.25
- Type Date hingefügt
- Code bereinigt

Im diesen Zuge habe ich den ersten Beitrag die Beschreibung überarbeitet :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Modul BaseClass ClassDispatch inklusive ClassFactory

Beitrag von mk-soft »

Update v1.27
- Optimiert: Die Übernahme von Variant zu Purebasic-Variablen
- Hinzugefügt: Datentype Variant für Methoden und Properties

Neu:
- Es gibt neue Macros zum definieren von Properties mit den Datentype Variant und Variant ByRef
- DispInvoke kann jetzt auch den Datentype Variant zurückgeben und als Argument übergeben werden.

Kurzes Beispiel

Code: Alles auswählen

;-TOP

; Example 1-3

IncludeFile "Modul_BaseClassDispatch.pb"

; Create Logfile
ClassCommon::EnableClassDebug()

; *******************************************************************************

DeclareModule ClassExample
  
  UseModule ClassDispatch
  ; Properties
  Structure sClassExample Extends sClassDispatch
    name.s
    data1.variant
    *data2.variant ; It must be allocated memory
    vResult.variant ; Helpbuffer for DispInvoke result of type Variant
  EndStructure
  
  ; Methodes
  Interface iClassExample Extends iClassDispatch
    GetName()
  EndInterface
  
  UnuseModule ClassDispatch
  ; Create new Object
  Declare.i New()
  
EndDeclareModule

Module ClassExample
  
  EnableExplicit
  
  UseModule ClassCommon
  UseModule ClassDispatch
  
  ; Create Class
  NewClass(iClassExample)
  
  ; ---------------------------------------------------------------------------
  
  ; Defined Public Properties
  UseProperty(sClassExample)
  DefineProperty(Name)
  DefinePropertyVariant(data1)
  DefinePropertyVariantByRef(data2)
  
  ; ---------------------------------------------------------------------------
  
  ; Do by new object
  Procedure Init(*this.sClassExample)
    ClassDebug("Init Object ", *this)
    *this\data2 = AllocateStructure(Variant)
  EndProcedure : AsInitalizeObject(Init)
  
  ; ---------------------------------------------------------------------------
  
  ; Do by release object
  Procedure Dispose(*this.sClassExample)
    ClassDebug("Dispose Object ", *this)
    FreeStructure(*this\data2)
  EndProcedure : AsDisposeObject(Dispose)
  
  ; ---------------------------------------------------------------------------
  
  Procedure GetName(*this.sClassExample) ; Result pointer to Variant
    With *this
      SetVariantString(\vResult, \name)
      ProcedureReturn \vResult
    EndWith
  EndProcedure : AsMethodeDisp(GetName, Variant)
  
  ; ---------------------------------------------------------------------------
  
  Procedure New()
    InitObject(sClassExample) ; Do not more
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  CheckInterface(iClassExample)
  
EndModule

; ***************************************************************************************

;- Create ClassFactory

EnableExplicit

; Always encapsulate in a procedure
Procedure InitDLL()
  Global ProgramId.s   = "PureExample.Application"
  Global ClassId.s     = ClassCommon::GetGuidString(?CLSID_App)
  Global Description.s = "Purebasic Example COM-DLL"
EndProcedure : InitDLL()

; Own CLSID
DataSection
  CLSID_App:
  Data.l $01AAD4B2
  Data.w $FFFF, $4E08
  Data.b $FF, $FF, $FF, $FF, $60, $FF, $3B, $21
EndDataSection

InitClassFactory(ProgramId, ClassId, Description, ClassExample::@New(), ?CLSID_App)
VBS
dim obj
set obj = createobject("PureExample.Application")

obj.name = now()
msgbox obj.getname()

obj.data1 = time()
obj.data2 = date()

msgbox "(" & obj.data1 & " " & obj.data2 & ")"

obj.data1 = "Purebasic Power"
msgbox obj.data1

set obj = Nothing
Hat sich einiges getan :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten