Modifying A Gadget from within a DLL

Windows specific forum
User avatar
Inner
PureBasic Expert
PureBasic Expert
Posts: 714
Joined: Fri Apr 25, 2003 4:47 pm
Location: New Zealand

Modifying A Gadget from within a DLL

Post 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 ?
freak
PureBasic Team
PureBasic Team
Posts: 5940
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

Post 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
quidquid Latine dictum sit altum videtur
User avatar
Inner
PureBasic Expert
PureBasic Expert
Posts: 714
Joined: Fri Apr 25, 2003 4:47 pm
Location: New Zealand

Post 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.
freak
PureBasic Team
PureBasic Team
Posts: 5940
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

Post 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
quidquid Latine dictum sit altum videtur
User avatar
Inner
PureBasic Expert
PureBasic Expert
Posts: 714
Joined: Fri Apr 25, 2003 4:47 pm
Location: New Zealand

Post by Inner »

Excellent! & thank you. :D

Gotta learn x86 Asmbler sometime :D
freak
PureBasic Team
PureBasic Team
Posts: 5940
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

Post by freak »

> Gotta learn x86 Asmbler sometime

Hehe, me too :wink:

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

Timo
quidquid Latine dictum sit altum videtur
PB
PureBasic Expert
PureBasic Expert
Posts: 7581
Joined: Fri Apr 25, 2003 5:24 pm

Post 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(...) ?
freak
PureBasic Team
PureBasic Team
Posts: 5940
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

Post by freak »

He's talking about commands like SetGadgetText()

Timo
quidquid Latine dictum sit altum videtur
User avatar
Inner
PureBasic Expert
PureBasic Expert
Posts: 714
Joined: Fri Apr 25, 2003 4:47 pm
Location: New Zealand

Post 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 :)
Post Reply