Modifying A Gadget from within a DLL
Modifying A Gadget from within a DLL
it just acured to me, that inside the DLL if you address a gadget by it's ID it won't know what your talking about since the gadget list wasn't created in the DLL, is there anyway to get the commands to address the gadgets from within a DLL ?
You can send the Gadget handle (get it with GadgetID(#Gadget)) to the
dll, and then use the API, to do what you want with the gadget.
This is not as easy, as the PB commands, but it should work. If you need
any help on controlling a specific Gadget with the API, just ask.
Timo
dll, and then use the API, to do what you want with the gadget.
This is not as easy, as the PB commands, but it should work. If you need
any help on controlling a specific Gadget with the API, just ask.
Timo
quidquid Latine dictum sit altum videtur
> Thanks for the info, what a shame PB's gadget commands can't take a
> gadget address rather than an ID, maybe it should be a feature request.
I think this will come, as soon as the Gadget Numbers are made optional.
I've experimented a bit, and found the following little trick, it let's you
still use PB's commands from within the DLL, to access the Gadgets.
First comes the DLL code:
And here the Main app:
Some notes about this:
Do not Create/Free any Gadgets fro inside the DLL, this should not work
correctly (lead to a crash). Instead, create all Gadgets from the main
App, and only modify them from the DLL!
The UpdateGadgetPointer() function must be called after each time you
created/freed Gadgets, as then this pointer may change internally. So
if you create new Gadgets somewhere, make sure, there is a
UpdateGadgetPointer() somewhere before the next call to the DLL.
That's it, happy coding...
Timo
> gadget address rather than an ID, maybe it should be a feature request.
I think this will come, as soon as the Gadget Numbers are made optional.
I've experimented a bit, and found the following little trick, it let's you
still use PB's commands from within the DLL, to access the Gadgets.
First comes the DLL code:
Code: Select all
ProcedureDLL SetGadgetPointer(Pointer.l)
Shared NewPointer.l
NewPointer = Pointer
!EXTRN _PB_Gadget_ObjectsArea
!MOV dword EAX, [v_NewPointer]
!MOV dword [_PB_Gadget_ObjectsArea], EAX
EndProcedure
ProcedureDLL Test(Gadget.l)
SetGadgetText(Gadget, "This is set from the DLL!")
EndProcedure
Code: Select all
Procedure UpdateGadgetPointer(Library.l)
Shared MainPointer.l
!EXTRN _PB_Gadget_ObjectsArea
!MOV dword EAX, [_PB_Gadget_ObjectsArea]
!MOV dword [v_MainPointer], EAX
CallFunction(Library, "SetGadgetPointer", MainPointer)
EndProcedure
#Lib = 1
#TextGadget = 1
If OpenLibrary(#Lib, "purebasic.dll")
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu|#PB_Window_Screencentered, "testing...")
If CreateGadgetList(WindowID())
TextGadget(#TextGadget, 10, 10, 280, 20, "This text is from the main prog!")
UpdateGadgetPointer(#Lib)
CallFunction(#Lib, "Test", #TextGadget)
Repeat
Until WaitWindowEvent() = #PB_EventCloseWindow
EndIf
EndIf
CloseLibrary(#Lib)
EndIf
End
Do not Create/Free any Gadgets fro inside the DLL, this should not work
correctly (lead to a crash). Instead, create all Gadgets from the main
App, and only modify them from the DLL!
The UpdateGadgetPointer() function must be called after each time you
created/freed Gadgets, as then this pointer may change internally. So
if you create new Gadgets somewhere, make sure, there is a
UpdateGadgetPointer() somewhere before the next call to the DLL.
That's it, happy coding...

Timo
quidquid Latine dictum sit altum videtur