Interner Aufruf einer Procedure in einer DLL

Anfängerfragen zum Programmieren mit PureBasic.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Interner Aufruf einer Procedure in einer DLL

Beitrag von funk.munich »

Hallo zusammen,

ich beschäftige mich gerade mimt dem Erstellen von DLL's. Funxt auch soweit.

Ist es möglich in einer DLL eine Prozedur aufzurufen?

Code: Alles auswählen

; -- get.pb
DLLName.s = "test.dll"
If OpenLibrary(1, DLLName)
   CallFunction(1, "initDll")
   CloseLibrary(1) 
EndIf

; -- test.dll
ProcedureDLL initDll()
  
  getInfo()

EndProcedure

ProcedureDLL getInfo()

  MessageRequester("DLL", "dll has been found.")

EndProcedure

Also so funxt es leider nicht :(

Danke im vorraus,
Daniel
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi,

ich bin es noch einmal. Jetzt habe ich noch folgendes Problem.
Ich möchte aus einer DLL ein Gadget Objekt in meinem Fenster erstellen.
Das gelingt mir jedoch nicht.

Code: Alles auswählen

; -- main.pb
Enumeration
  #MAIN
EndEnumeration

; Initialize Main Window
#FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget
hWnd = OpenWindow(#MAIN, 0, 0, 500, 200, #FLAGS, "DLL test")

CreateGadgetList(WindowID())
StringGadget(10,0,0,230,20,"Test 1")

If OpenLibrary(1, "pb.dll")
  CallFunction(1, "initPB", hWnd)
EndIf
  
CloseLibrary(1)

; Event Handle
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
End

; -- pb.dll
Declare setGadget(hWnd)

ProcedureDLL initPB(hWnd)
  
  setGadget(hWnd)
  
EndProcedure

ProcedureDLL setGadget(hWnd)

  CreateGadgetList(WindowID(hWnd))  ; oder UseGadgetList() - funxt aber nicht
  StringGadget(20,10,50,230,20,"Test")

EndProcedure
Hätte hierzu jemand einen Tipp? Was mache ich falsch?

Danke + Gruß,
Daniel
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi,

und hier der 3. Versuch eine Antwort zu erreichen :wink:
Ich habe es jetzt hinbekommen, jedoch nur, wenn ich das Objekt
über einen Container ansteuere.
Wenn ich z.B. direkt auf ein Panel ein StringGadget erstellen will
oder ein zusätzliches Panel hinzufügen möchte, funktioniert es nicht.

Hier der Code der EXE:

Code: Alles auswählen

OpenWindow(0,0,0,600,260,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"")
CreateGadgetList(WindowID(0))

PanelGadget(5,8,8,300,200)
AddGadgetItem (5,-1,"Panel 1")
;container = ContainerGadget(#PB_Any,0,0,295,170)
;CloseGadgetList()
CloseGadgetList()

OpenLibrary(1, "pb.dll")
;CallFunction(1,"initPB", GadgetID(container))
CallFunction(1,"initPB", 5)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver

CloseWindow(0)
CloseLibrary(1)
Und hier für die DLL:

Code: Alles auswählen

ProcedureDLL initPB(hWnd)

  UseGadgetList(hWnd)
  
  TextGadget(10,0,00,100,20,"hallo welt!")
  
EndProcedure
Also, wenn ich den ausgeklammerten Container wieder mit einbinde
arbeitet es einwandfrei, aber eben nur so.

Wird Panel für soetwas überhaupt unterstützt?

Ich würde mich über jeden Tipp/Vorschlag freuen :)

Danke + Gruß,
Daniel
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Hallo.
Ich kann wohl nur erstes Anliegen beantworten.
Klar das geht, im Grunde genau wie du es gemacht hast, nur muß die Procedure die du aufrust VOR dem Aufruf selbst stehen, sonst kennt PB diese Procedure nicht. Einfach die Reihenfolge der Proceduren ändern. Oder was du sonst auch machen kannst ist die Procedure vorher declarieren.

ungestet:

Code: Alles auswählen

; -- get.pb 
DLLName.s = "test.dll" 
If OpenLibrary(1, DLLName) 
   CallFunction(1, "initDll") 
   CloseLibrary(1) 
EndIf 

; -- test.dll 
ProcedureDLL getInfo() 

  MessageRequester("DLL", "dll has been found.") 

EndProcedure 
ProcedureDLL initDll() 
  
  getInfo() 

EndProcedure 
oder

Code: Alles auswählen

; -- get.pb 
DLLName.s = "test.dll" 
If OpenLibrary(1, DLLName) 
   CallFunction(1, "initDll") 
   CloseLibrary(1) 
EndIf 

; -- test.dll 
declare getInfo() ; wenn der 'Aufruf falsch ist, schau mal unter declare in der Hiledatei.
ProcedureDLL initDll() 
  
  getInfo() 

EndProcedure 

ProcedureDLL getInfo() 

  MessageRequester("DLL", "dll has been found.") 

EndProcedure 
Ach ja, das gilt nicht nur in der DLL, das gilt auch in "normalen PB-Programmcodes".

Mit Fenstern und Gadgets habe ich mich noch nicht so viel beschäftigt und daher auch nicht die Lust da jetzt auch gleich einzusteigen. Aber da hilft dir sicher jemand anders.

Gruß
Toshy
1. Win10
PB6.1
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi zusammen,

ich habe jetzt das Problem hinbekommen mit Hilfe von srod vom EN Forum.

Vielleicht kann das ja der eine oder andere gebrauchen.

Daniel

EXE:

Code: Alles auswählen

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

Procedure getID(ID)

  tci.TC_ITEM
  tci\mask=#TCIF_PARAM   
  SendMessage_(GadgetID(ID), #TCM_GETITEM, GetGadgetState(ID), tci)
  
  ProcedureReturn tci\lparam
EndProcedure

Enumeration
  #Main
  #Panel
  #LIB
EndEnumeration

DLL.s = "pb.dll"

hWnd = OpenWindow(#Main,0,0,600,260,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"")

If CreateGadgetList(WindowID(*hWnd))

  PanelGadget(#Panel,8,8,306,203)
    AddGadgetItem (#Panel,-1,"Panel 1")
  CloseGadgetList()

  If OpenLibrary(#LIB, DLL)

    UpdateGadgetPointer(#LIB)
    
    ; Set one Button to Panel 1
    CallFunction(#LIB, "setBtn", getID(#Panel), 1)
    
    ; Create Panel 2
    CallFunction(#LIB, "setPanel", #Panel, 2)
    ; Create Button to 2nd Panel
    SetGadgetState(#Panel, 1)
    CallFunction(#LIB, "setBtn", getID(#Panel), 2)

  EndIf
EndIf

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver

CloseWindow(#MAIN)
CloseLibrary(#LIB)
End
DLL:

Code: Alles auswählen

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 setPanel(Gadget, no)

    AddGadgetItem (Gadget, -1, "Panel " + Str(no))
 
EndProcedure 

ProcedureDLL setBtn(hWnd, no)  
  
  UseGadgetList(hWnd)
  ButtonGadget(10 + no,20,20,60,20,"Test " + Str(no))     
 
EndProcedure 
Antworten