Module BaseClass ClassDispatch inclusive ClassFactory

Share your advanced PureBasic knowledge/code with the community.
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by Kwai chang caine »

Thanks for the update 8)

I have test it on other machine Under W10 X64
And when i try to register, i have this error :|
Le module « c:\example1.dll » a été chargé, mais l’appel à DllRegisterServer a échoué avec le code d’erreur 0x80009e41.
The module is loaded, but the call of a DllRegisterServer have failled with the error code 0x80009e41
ImageThe happiness is a road...
Not a destination
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

Windows 10 Problem.

Registry 32bit-DLL it´s work but not as 64bit-DLL. I don´t know. Under Windows 7 no problem...
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by Kwai chang caine »

Ok thanks :wink:
ImageThe happiness is a road...
Not a destination
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

Update v1.09
- Bugfix Windows 10 (X64-DLL´s). 'DLLRegisterServer' crashed by initialize internal PB-Modules with global variables

When the DLL is loaded, all the codes in the modules are executed.
When using global variables and the code is not encapsulated in a procedure, this leads to the crash.

I don´t know why this only on Windows 10 crashed?

It´s now work :wink:

P.S. Because Errorcode 80009E41 (#SELFREG_E_CLASS)
The server was unable to complete the registration of all the object classes.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

Update v1.10
- Bugfix ClassDebug
- Optimize code

Works now stable under Window 7 and Windows 10 as x86 or x64 code :wink:

Logfile from Example 2
Start Logging: 2017-03-25 17:17:22
[ClassValues.] Begin Initalize Module
[ClassValues.] End Initalize Module
[COM.DLL] AttachProzess
[COM.DLL] GetClassObject: Object ok
[ClassFactory.AddRef] RefCounterer: 1
[ClassFactory.AddRef] RefCounterer: 2
[ClassFactory.Release] RefCounterer: 1
[ClassFactory.QueryInterface] Interface IClassFactory ok
[ClassFactory.Release] RefCounterer: 1
[ClassFactory.QueryInterface] Error: Interface not exists {342D1EA0-AE25-11D1-89C5-006008C3FBFC}
[ClassValues.Init] Initalize Object
[ClassFactory.CreateInstance] New object ok
[ClassFactory.Release] Object released
[ClassDispatch.QueryInterface] Error: Interface not exists {FC4801A3-2BA9-11CF-A229-00AA003D7352}
[ClassDispatch.QueryInterface] Interface IDispatch ok
[ClassDispatch.AddRef] RefCounterer: 2
[ClassDispatch.Release] RefCounterer: 1
[ClassDispatch.Release] RefCounterer: 0
[ClassDispatch.AddRef] RefCounterer: 1
[ClassDispatch.Release] RefCounterer: 0
[ClassDispatch.QueryInterface] Error: Interface not exists {A6EF9860-C720-11D0-9337-00A0C90DCAA9}
[ClassDispatch.GetIDsOfNames] DoublePut: 11
[ClassDispatch.AddRef] RefCounterer: 1
[ClassDispatch.QueryInterface] Error: Interface not exists {A6EF9860-C720-11D0-9337-00A0C90DCAA9}
[ClassDispatch.Invoke] DispID 11
[ClassDispatch.Release] RefCounterer: 0
[ClassDispatch.QueryInterface] Error: Interface not exists {A6EF9860-C720-11D0-9337-00A0C90DCAA9}
[ClassDispatch.GetIDsOfNames] StringPut: 13
[ClassDispatch.AddRef] RefCounterer: 1
[ClassDispatch.QueryInterface] Error: Interface not exists {A6EF9860-C720-11D0-9337-00A0C90DCAA9}
[ClassDispatch.Invoke] DispID 13
[ClassDispatch.Release] RefCounterer: 0
[ClassDispatch.QueryInterface] Error: Interface not exists {A6EF9860-C720-11D0-9337-00A0C90DCAA9}
[ClassDispatch.GetIDsOfNames] DoubleGet: 12
[ClassDispatch.AddRef] RefCounterer: 1
[ClassDispatch.QueryInterface] Error: Interface not exists {A6EF9860-C720-11D0-9337-00A0C90DCAA9}
[ClassDispatch.Invoke] DispID 12
[ClassDispatch.Release] RefCounterer: 0
[ClassDispatch.QueryInterface] Error: Interface not exists {A6EF9860-C720-11D0-9337-00A0C90DCAA9}
[ClassDispatch.GetIDsOfNames] stringGet: 14
[ClassDispatch.AddRef] RefCounterer: 1
[ClassDispatch.QueryInterface] Error: Interface not exists {A6EF9860-C720-11D0-9337-00A0C90DCAA9}
[ClassDispatch.Invoke] DispID 14
[ClassDispatch.Release] RefCounterer: 0
[ClassValues.Dispose] Dispose Object
[ClassDispatch.Release] Object Released
[COM.DLL] DetachThread
[COM.DLL] CanUnloadNow Ok
[COM.DLL] DetachProzess
'Error: Interface not exists' it´s normally because VBS query interface IClassFactoryEx and IDispatchEx as first.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

Example 3: Multiline InputBox :wink:

Format:
List = obj.InputBox(Titel, Message1, Message2, Message3, ..., MessageX)

example3.dll

Code: Select all

;-TOP

IncludeFile "Modul_BaseClassDispatch.pb"

; Create Logfile
ClassCommon::EnableClassDebug()

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

DeclareModule ClassDialog
  
  UseModule ClassDispatch
  
  Structure sClassDialog Extends sClassDispatch
    
  EndStructure
  
  Interface iClassDialog Extends iClassDispatch
    InputBox(*this.sClassDialog, DispId.l, *iid.IID, lcid.l, Flags.w, *DispParams.DISPPARAMS, *vResult.VARIANT, *ExcepInfo.EXCEPINFO, *ArgErr.Integer)
  EndInterface
  
  UnuseModule ClassDispatch
  
  Declare.i New()
  
EndDeclareModule

Module ClassDialog
  
  EnableExplicit
  
  UseModule ClassCommon
  UseModule ClassDispatch
  
  CompilerIf Defined(pData, #PB_Structure) = 0
    Structure pData
      StructureUnion
        llVal.q[0]
        lVal.l[0]
        bVal.b[0]
        iVal.w[0]
        fltVal.f[0]
        dblVal.d[0]
        boolVal.w[0]
        bool.w[0]
        scode.l[0]
        cyVal.l[0]
        date.d[0]
        bstrVal.i[0]
        varVal.VARIANT[0]
        Value.VARIANT[0]
      EndStructureUnion
    EndStructure
  CompilerEndIf

  NewClass(iClassDialog)
  
  ; ---------------------------------------------------------------------------
  
  Procedure saCreateSafeArray(vartype, Lbound, Elements)
    Protected rgsabound.SAFEARRAYBOUND, *psa
    rgsabound\lLbound = Lbound
    rgsabound\cElements = Elements
    *psa = SafeArrayCreate_(vartype, 1, rgsabound)
    ProcedureReturn *psa
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  ; Format:
  ; List = obj.InputBox(Titel, Message1, Message2, Message3, ..., MessageX)

  Procedure InputBox(*this.sClassDialog, DispId.l, *iid.IID, lcid.l, Flags.w, *DispParams.DISPPARAMS, *vResult.VARIANT, *ExcepInfo.EXCEPINFO, *ArgErr.Integer)
    Protected cArgs, *vArgs.udtArrayVariant
    Protected r1.s, count, index , x, y, iArg, btnOk, *psa.safearray
    
    cArgs = *DispParams\cArgs
    *vArgs = *DispParams\rgvarg
    If cArgs < 2
      ProcedureReturn #DISP_E_BADPARAMCOUNT
    EndIf
    ; Create Dialog
    iArg = cArgs - 1
    count = cArgs - 1
    y = 5
    If OpenWindow(0, #PB_Ignore, #PB_Ignore, 480, 30 * count + 40, GetVariantString(*vArgs\Arg[iArg]))
      For index = 0 To count - 1
        iArg - 1
        TextGadget(#PB_Any, 5, y + 3, 120, 24, GetVariantString(*vArgs\Arg[iArg]))
        StringGadget(index, 130, y, 340, 24, "")
        y + 30
      Next
      btnOk = ButtonGadget(#PB_Any, 180, y, 120, 25, "Ok")
      Repeat
        Select WaitWindowEvent()
          Case #PB_Event_Gadget
            If EventGadget() = btnOk
              Break
            EndIf
          Case #PB_Event_CloseWindow
            Break
        EndSelect
      ForEver
      ; Create array für result
      *psa = saCreateSafeArray(#VT_VARIANT, 0, count) 
      If Not *psa
        CloseWindow(0)
        ProcedureReturn #E_OUTOFMEMORY
      EndIf
      ; Fill array from diaglog
      For index = 0 To count - 1
        SetVariantString(*psa\pvData\Value[index], GetGadgetText(index))
      Next
      ; Set result to array
      *vResult\vt = #VT_ARRAY | #VT_VARIANT
      *vResult\parray = *psa
      CloseWindow(0)
      ProcedureReturn #S_OK
    Else
      ProcedureReturn #E_OUTOFMEMORY
    EndIf
  EndProcedure : AsMethode(InputBox)
  
  ; ---------------------------------------------------------------------------
  
  Procedure New()
    InitObject(sClassDialog)
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  CheckInterface(iClassDialog)
  
  
EndModule

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

Global ProgramId.s   = "PureExample3.Application"
Global ClassId.s    = "{01AAD4B2-FFFF-4E08-FFFF-FFFF60FF3B23}"
Global Description.s = "Purebasic Example 3 Dialog"

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

InitClassFactory(ProgramId, ClassId, Description, ClassDialog::@New(), ?CLSID_App)

; ***************************************************************************************
VBS
dim obj, list, item, text
set obj = createobject("PureExample3.Application")
'list = obj.InputBox("Multi Input Box", "Fisrst Name:", "Last name:")
list = obj.InputBox("Multi Input Box", "Fisrst Name:", "Last name:", "Age:")
For Each item In list
text = text + item + vbNewLine
next
msgbox text
set obj = Nothing
Last edited by mk-soft on Sat Apr 08, 2017 10:43 am, edited 1 time in total.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
QuimV
Enthusiast
Enthusiast
Posts: 337
Joined: Mon May 29, 2006 11:29 am
Location: BARCELONA - SPAIN

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by QuimV »

:D Thank you very much for sharing such an interesting code.
QuimV
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by Kwai chang caine »

ImputBox works great here with W7
What a hard code for only a little input requester :shock:
Really, ...... CROSOFT don't like the simplicity :lol:

Thanks a lot for sharing all your big job 8)
ImageThe happiness is a road...
Not a destination
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

Thank you for testing
Here is a stupid example of how to return an object

Example 4

Code: Select all

;-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 DispUpper(*this.iClassTextObject, DispId.l, *iid.IID, lcid.l, Flags.w, *DispParams.DISPPARAMS, *vResult.VARIANT, *ExcepInfo.EXCEPINFO, *ArgErr.Integer)
    Protected cArgs, *vArgs.udtArrayVariant, text.s
    cArgs = *DispParams\cArgs
    *vArgs = *DispParams\rgvarg
    If cArgs <> 0
      ProcedureReturn #DISP_E_BADPARAMCOUNT
    EndIf
    text = *this\Upper()
    SetVariantString(*vResult, text)
    ProcedureReturn #S_OK
  EndProcedure
  
  Procedure.s Upper(*this.sClassTextObject) ; Result String
    ProcedureReturn UCase(*this\text)
  EndProcedure : AsMethode(Upper)
  
  ; ---------------------------------------------------------------------------
  
  ; Format: Text = Object.Lower
  
  Procedure DispLower(*this.iClassTextObject, DispId.l, *iid.IID, lcid.l, Flags.w, *DispParams.DISPPARAMS, *vResult.VARIANT, *ExcepInfo.EXCEPINFO, *ArgErr.Integer)
    Protected cArgs, *vArgs.udtArrayVariant, text.s
    cArgs = *DispParams\cArgs
    *vArgs = *DispParams\rgvarg
    If cArgs <> 0
      ProcedureReturn #DISP_E_BADPARAMCOUNT
    EndIf
    text = *this\Lower()
    SetVariantString(*vResult, text)
    ProcedureReturn #S_OK
  EndProcedure
  
  Procedure.s Lower(*this.sClassTextObject) ; Result String
    ProcedureReturn LCase(*this\text)
  EndProcedure : AsMethode(Lower)
  
  ; ---------------------------------------------------------------------------
  
  ; Format : Text = Object.Reverse
  
  Procedure DispReverse(*this.iClassTextObject, DispId.l, *iid.IID, lcid.l, Flags.w, *DispParams.DISPPARAMS, *vResult.VARIANT, *ExcepInfo.EXCEPINFO, *ArgErr.Integer)
    Protected cArgs, *vArgs.udtArrayVariant, text.s
    cArgs = *DispParams\cArgs
    *vArgs = *DispParams\rgvarg
    If cArgs <> 0
      ProcedureReturn #DISP_E_BADPARAMCOUNT
    EndIf
    text = *this\Reverse()
    SetVariantString(*vResult, text)
    ProcedureReturn #S_OK
  EndProcedure
  
  Procedure.s Reverse(*this.sClassTextObject) ; Result String
    ProcedureReturn ReverseString(*this\text)
  EndProcedure : AsMethode(Reverse)
  
  ; ---------------------------------------------------------------------------
  
  Procedure Init(*this.sClassTextObject)
    ClassDebug("Init TextObject")
  EndProcedure : AsInitalizeObject(Init)
  
  Procedure Dispose(*this.sClassTextObject)
    ClassDebug("Dispose TextObject")
  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 DispText(*this.iClassText, DispId.l, *iid.IID, lcid.l, Flags.w, *DispParams.DISPPARAMS, *vResult.VARIANT, *ExcepInfo.EXCEPINFO, *ArgErr.Integer)
    Protected cArgs, *vArgs.udtArrayVariant, *object
    cArgs = *DispParams\cArgs
    *vArgs = *DispParams\rgvarg
    If cArgs <> 1
      ProcedureReturn #DISP_E_BADPARAMCOUNT
    EndIf
    *object = *this\Text(GetVariantString(*vArgs\Arg[0]))
    If *object
      *vResult\vt = #VT_DISPATCH
      *vResult\pdispVal = *object
      ProcedureReturn #S_OK
    Else
      ProcedureReturn #E_OUTOFMEMORY
    EndIf
  EndProcedure
  
  Procedure Text(*this.iClassText, String.s) ; Result: Object of iClassTextObject
    ProcedureReturn ClassTextObject::New(String)
  EndProcedure : AsMethode(Text)
  
  ; ---------------------------------------------------------------------------
  
  Procedure New()
    InitObject(sClassText)
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  CheckInterface(iClassText)
  
EndModule

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

;- Test as DLL

CompilerIf #PB_Compiler_Debugger
  
  Debug "Test with Purebasic code"
  
  *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
  
  Global ProgramId.s   = "PureExample4.Application"
  Global ClassId.s    = "{01AAD4B2-FFFF-4E08-FFFF-FFFF60FF3B24}"
  Global Description.s = "Purebasic Example 4 with simple object"
  
  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
VBS
dim obj, obj2, text
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
:wink:
Last edited by mk-soft on Sat Apr 08, 2017 10:44 am, edited 1 time in total.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by Kwai chang caine »

That's works very well always under W7 X86
I'm surprising to see, VBS is OOP like .NET :shock:

Me, i believe for write U/LCASE, i must do like this :oops:

Code: Select all

TXT= "This Will Be Uppercase."
MsgBox TXT
TXT = UCase(TXT)
MsgBox TXT
Thanks for this new exemple 8)
ImageThe happiness is a road...
Not a destination
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

COM-DLL Automation is OOP :mrgreen:

Work my examples under Windows 7 X64. At my home works with windows 7 and Windows 10 as X64-DLL. :wink:
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

Bugfix for X64-DLL´s

The building of CLSID string over GetGuidString fails on some Windows 7 machine.

Code: Select all

Global ProgramId.s   = "PureExample3.Application"
Global ClassId.s    = "{01AAD4B2-FFFF-4E08-FFFF-FFFF60FF3B23}"
;Global ClassId.s    = ClassCommon::GetGuidString(?CLSID_App) ; Don´t work with X64-DLL, but as X32-DLL
Global Description.s = "Purebasic Example 3 Dialog"
Is probably a rule that only direct global assignments are allowed

P.S. All examples updated...
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

Update v1.11
- Added: ClassCommon compiler constant #EnableClassDebug. Set to False for remove all class debug functions for smaller code
- Change ClassDebug: Added optional parameter 'Object'
- Optimize code

:wink:
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

Removed...
Last edited by mk-soft on Sun Apr 16, 2017 12:56 pm, edited 1 time in total.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BaseClass ClassDispatch inclusive ClassFactory

Post by mk-soft »

Update v1.14
- Changed internal class management because of the rules for creating DLLs

Thus, the rule also applies to the initialization of ClassFactory

Code: Select all

...
Procedure InitDLL()
  Global ProgramId.s   = "PureExample3.Application"
  Global ClassId.s    = ClassCommon::GetGuidString(?CLSID_App) ;"{01AAD4B2-FFFF-4E08-FFFF-FFFF60FF3B23}"
  Global Description.s = "Purebasic Example 3 Dialog"
EndProcedure : InitDLL()

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

InitClassFactory(ProgramId, ClassId, Description, ClassDialog::@New(), ?CLSID_App)
Info
Purebasic packs all global calling procedures into internal procedure PB_DllInit.
This is called first at entrypoint 'ProcessAttach and then the created ProcedureDLL AttachProcess (...).
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Post Reply