Re: Modul BaseClass ClassDispatch inklusive ClassFactory
Verfasst: 04.05.2017 20:23
Update v1.18
- Bugfix InitObject
- Bugfix InitObject
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Code: Alles auswählen
r1 + RegSetValueEx_ (hKey, "", 0, #REG_SZ, CF_ProgramID + ".1", StringByteLength(CF_Description) + 2)
Code: Alles auswählen
r1 + RegSetValueEx_ (hKey, "", 0, #REG_SZ, CF_ProgramID + ".1", StringByteLength(CF_ProgramID + ".1") + 2)
Mir gibts eigentlich um die Länge - links steht cf_programid+.1, rechts cf_description.mk-soft hat geschrieben:Die ProgID ist ein nicht eindeutiger Verweis mit Versionsnummer. Zur Zeit nicht relevant.
Sollte es mehr als eine Version geben, muss die ProgramID mit Versionsnummer in der HKEY_CLASSES_ROOT zusätzlich eingetragen werden.
Code: Alles auswählen
;-TOP
IncludeFile "Modul_BaseClassDispatch.pb"
; Create Logfile
ClassCommon::EnableClassDebug()
; *******************************************************************************
DeclareModule ClassTextObject
UseModule ClassDispatch
Structure sClassTextObject Extends sClassDispatch
text.s
EndStructure
Interface iClassTextObject Extends iClassDispatch
Upper.s()
Lower.s()
Reverse.s()
EndInterface
UnuseModule ClassDispatch
Declare.i New(Text.s)
EndDeclareModule
Module ClassTextObject
EnableExplicit
UseModule ClassCommon
UseModule ClassDispatch
NewClass(iClassTextObject)
; ---------------------------------------------------------------------------
; Format: Text = Object.Upper
Procedure.s Upper(*this.sClassTextObject) ; Result String
ProcedureReturn UCase(*this\text)
EndProcedure : AsMethodeDisp(Upper, String)
; ---------------------------------------------------------------------------
; Format: Text = Object.Lower
Procedure.s Lower(*this.sClassTextObject) ; Result String
ProcedureReturn LCase(*this\text)
EndProcedure : AsMethodeDisp(Lower, String)
; ---------------------------------------------------------------------------
; Format : Text = Object.Reverse
Procedure.s Reverse(*this.sClassTextObject) ; Result String
ProcedureReturn ReverseString(*this\text)
EndProcedure : AsMethodeDisp(Reverse, String)
; ---------------------------------------------------------------------------
Procedure Init(*this.sClassTextObject)
ClassDebug("Init TextObject", *this)
EndProcedure : AsInitalizeObject(Init)
Procedure Dispose(*this.sClassTextObject)
ClassDebug("Dispose TextObject", *this)
EndProcedure : AsDisposeObject(Dispose)
; ---------------------------------------------------------------------------
Procedure New(text.s)
Protected *obj.sClassTextObject
AllocateObject(*obj, sClassTextObject)
If *obj
*obj\text = text
InitalizeObject(*obj)
EndIf
ProcedureReturn *obj
EndProcedure
; ---------------------------------------------------------------------------
CheckInterface(iClassTextObject)
EndModule
; ***************************************************************************************
DeclareModule ClassText
UseModule ClassDispatch
Structure sClassText Extends sClassDispatch
EndStructure
Interface iClassText Extends iClassDispatch
Text(String.s)
EndInterface
UnuseModule ClassDispatch
Declare.i New()
EndDeclareModule
Module ClassText
EnableExplicit
UseModule ClassCommon
UseModule ClassDispatch
NewClass(iClassText)
; ---------------------------------------------------------------------------
; Object = obj.Text("String")
Procedure Text(*this.iClassText, String.s) ; Result: Object of iClassTextObject
ProcedureReturn ClassTextObject::New(String)
EndProcedure : AsMethodeDisp(Text, Object, String)
; ---------------------------------------------------------------------------
Procedure New()
InitObject(sClassText)
EndProcedure
; ---------------------------------------------------------------------------
CheckInterface(iClassText)
EndModule
; ***************************************************************************************
;- Test as DLL
CompilerIf #PB_Compiler_Debugger
Debug "Test with Purebasic code"
ClassDispatch::ShowClasses()
*obj.ClassText::iClassText = ClassText::New()
*obj2.ClassTextObject::iClassTextObject = *obj\Text("Hello World")
Debug *obj2\Upper()
Debug *obj2\Lower()
Debug *obj2\Reverse()
*obj2\Release()
*obj\Release()
CompilerElse
; Create DLL
EnableExplicit
Procedure InitDLL()
Global ProgramId.s = "PureExample4.Application"
Global ClassId.s = ClassCommon::GetGuidString(?CLSID_App); "{01AAD4B2-FFFF-4E08-FFFF-FFFF60FF3B24}"
Global Description.s = "Purebasic Example 4 with simple object"
EndProcedure : InitDLL()
DataSection
CLSID_App:
Data.l $01AAD4B2
Data.w $FFFF, $4E08
Data.b $FF, $FF, $FF, $FF, $60, $FF, $3B, $24
EndDataSection
InitClassFactory(ProgramId, ClassId, Description, ClassText::@New(), ?CLSID_App)
CompilerEndIf
dim obj, obj2
set obj = createobject("PureExample4.Application")
set obj2 = obj.text("Hello World")
msgbox obj2.Upper
msgbox obj2.Lower
msgbox obj2.Reverse
msgbox obj.text("purebasic ").Upper & obj.text("rewoP").Reverse
set obj = Nothing
Code: Alles auswählen
;-TOP
IncludeFile "Modul_BaseClassDispatch.pb"
; Create Logfile
ClassCommon::EnableClassDebug()
; *******************************************************************************
DeclareModule ClassUser
UseModule ClassDispatch
Structure sClassUser Extends sClassDispatch
firstname.s
lastname.s
age.i
EndStructure
Interface iClassUser Extends iClassDispatch
SetName(FirstName.s, LastName.s)
GetName.s()
GetFirstName.s()
GetLastName.s()
EndInterface
UnuseModule ClassDispatch
Declare.i New()
EndDeclareModule
Module ClassUser
EnableExplicit
UseModule ClassCommon
UseModule ClassDispatch
NewClass(iClassUser)
; ---------------------------------------------------------------------------
UseProperty(sClassUser)
DefineProperty(firstname)
DefineProperty(lastname)
DefineProperty(age)
; ---------------------------------------------------------------------------
Procedure Init(*this.sClassUser)
*this\firstname = "no name"
*this\lastname = "no name"
EndProcedure : AsInitalizeObject(Init)
; ---------------------------------------------------------------------------
Procedure Dispose(*this.sClassUser)
Debug "Dispose Object " + *this
EndProcedure : AsDisposeObject(Dispose)
; ---------------------------------------------------------------------------
Procedure SetName(*this.sClassUser, FirstName.s, LastName.s)
ClassDebug("Parameter: " + FirstName + ", " + LastName)
With *this
\firstname = FirstName
\lastname = LastName
EndWith
EndProcedure : AsMethodeDisp(SetName, Void, String, String)
; ---------------------------------------------------------------------------
Procedure.s GetName(*this.sClassUser)
Protected text.s
With *this
text = "Name: " + \firstname + " " + \lastname + "; Age: " + Str(\age)
ProcedureReturn text
EndWith
EndProcedure : AsMethodeDisp(GetName, String)
; ---------------------------------------------------------------------------
Procedure.s GetFirstName(*this.sClassUser)
Protected text.s
With *this
text = \firstname
ProcedureReturn text
EndWith
EndProcedure : AsMethodeDisp(GetFirstName, String)
; ---------------------------------------------------------------------------
Procedure.s GetLastName(*this.sClassUser)
Protected text.s
With *this
text = \lastname
ProcedureReturn text
EndWith
EndProcedure : AsMethodeDisp(GetLastName, String)
; ---------------------------------------------------------------------------
Procedure New()
InitObject(sClassUser)
EndProcedure
; ---------------------------------------------------------------------------
CheckInterface(iClassUser)
EndModule
; ***************************************************************************************
;- Test as DLL
EnableExplicit
Procedure InitDLL()
Global ProgramId.s = "PureExample.Application"
Global ClassId.s = "{01AAD4B2-FFFF-4E08-FFFF-FFFF60FF3B21}"
Global Description.s = "Purebasic Example COM-DLL"
EndProcedure : InitDLL()
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, ClassUser::@New(), ?CLSID_App)
dim obj, text
set obj = createobject("PureExample.Application")
obj.SetName "Purebasic", "COM-Power"
msgbox obj.firstname
msgbox obj.lastname
obj.firstname = "Tom"
obj.lastname = "Smith"
obj.age = 51
msgbox obj.getname
set obj = Nothing
Code: Alles auswählen
Procedure.s GetVariantString(*vArg.Variant)
Protected r1.s, vArg.Variant
If VariantCopy_(vArg, *vArg) = #S_OK
VariantChangeType_(vArg, vArg, 0, #VT_BSTR)
r1 = PeekS(vArg\bstrVal)
Else
r1 = ""
EndIf
VariantClear_(vArg)
ProcedureReturn r1
EndProcedure
Code: Alles auswählen
Procedure.i MeineMetohde(*This, [in/out] Result, [in] Arg, ...)
...
ProcedureReturn #S_OK
EndProcedure
Code: Alles auswählen
OBJ1\Invoke "GetText"
Code: Alles auswählen
Interface Direct
...
GetText()
EndInterface
obj2.direct
OBJ1\QueryInterface IID1,@OBJ2
OBJ2\GetText()