Page 1 of 1

Modifying A Gadget from within a DLL

Posted: Wed Jun 04, 2003 10:53 am
by Inner
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 ?

Posted: Wed Jun 04, 2003 12:29 pm
by freak
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

Posted: Wed Jun 04, 2003 12:47 pm
by Inner
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.

Posted: Wed Jun 04, 2003 1:13 pm
by freak
> 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:

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
And here the Main app:

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
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... 8)

Timo

Posted: Wed Jun 04, 2003 2:56 pm
by Inner
Excellent! & thank you. :D

Gotta learn x86 Asmbler sometime :D

Posted: Wed Jun 04, 2003 2:59 pm
by freak
> Gotta learn x86 Asmbler sometime

Hehe, me too :wink:

I only know a bit from looking at other peoples code.

Timo

Posted: Wed Jun 04, 2003 3:18 pm
by PB
> what a shame PB's gadget commands can't take a gadget address
> rather than an ID

What's wrong with address=ButtonGadget(...) ?

Posted: Wed Jun 04, 2003 3:50 pm
by freak
He's talking about commands like SetGadgetText()

Timo

Posted: Wed Jun 04, 2003 7:27 pm
by Inner
Works great with my treegadget, weldone most impressed, your name has been added to my list of people that I've used functions for, which is a grand total of 1 so far :)