Das hab ich mir mit Hilfe dieses Forums mal zusammengebaut.
Code: Alles auswählen
;Hauptprogramm.EXE
;PureBasic v3.94
Enumeration
#aWindow_0
#Button_0
#Listview_0
#Library
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#aWindow_0, 30, 150, 359, 230, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Hauptprogramm")
If CreateGadgetList(WindowID())
ButtonGadget(#Button_0, 165, 180, 130, 35, "RUN catch.dll")
ListViewGadget(#Listview_0, 25, 15, 300, 155)
AddGadgetItem (#Listview_0,-1," catch my if you can")
AddGadgetItem (#Listview_0,-1,"")
AddGadgetItem (#Listview_0,-1,"Die catch.DLL Holt den Text aus Zeile 1")
AddGadgetItem (#Listview_0,-1,"Und gibt ihn an die Hauptprogramm.exe weiter.")
EndIf
EndIf
EndProcedure
Open_Window_0()
Repeat
If GetGadgetItemText(#Listview_0, 0, 1) = ""
AddGadgetItem (#Listview_0,-1,"Uhrzeit -> "+ FormatDate("%hh:%ii:%ss", Date()))
EndIf
Select WindowEvent()
Case #PB_EventCloseWindow
End
Case #PB_EventGadget
Select EventGadgetID()
Case #Button_0
If OpenLibrary(#Library, "catch.dll")
Ergebnis3.s = PeekS(CallFunction(#Library, "catch_My" ,0,0,0,0))
CloseLibrary(#Library)
MessageRequester("Hauptprogramm ", "Ich bin das Hauptprogramm" + Chr(13) + "Und bekam von der DLL den Text" + Chr(13) + Chr(13) + Ergebnis3 , 0)
Else
MessageRequester("error","catch.DLL nicht gefunden",0)
EndIf
EndSelect
EndSelect
Delay (3)
ForEver
Code: Alles auswählen
;catch.dll
;PureBasic v3.94
Handle.l = 0
ReturnString$ = ""
Global ReturnString$
Buffer.s = ""
Global Buffer.s
MyID1 = 0
Global MyID1
Ja = 0
Global Ja
KillProg.l = 0
Global KillProg.l
Anzeigefenster$ = "Hauptprogramm"
AnzeigeElement$ = "ListBox"
SucheName1.s = Anzeigefenster$
SucheName2.s = AnzeigeElement$
Global SucheName1.s
Global SucheName2.s
Declare EnumAllWindows()
Declare EnumAllSubChilds(Handle.l)
Declare EnumProc(Handle.l, lParam.l)
Declare.s GetTitle(Handle)
Declare.s GetClassName(Handle.l)
Declare AddWindow(Handle.l, ProcessID.l, Name.s, ClassName.s)
Global Window
Structure Window
Handle.l
Process.l
Name.s
Class.s
EndStructure
Procedure.s GetClassName(Handle.l)
Class.s = Space(1024)
GetClassName_(Handle, @Class , Len(Class))
ProcedureReturn Left(Class, Len(Class))
EndProcedure
Procedure.s GetTitle(Handle)
Name.s = Space(1024)
GetWindowText_(Handle, @Name, Len(Name))
ProcedureReturn Left(Name, Len(Name))
EndProcedure
Procedure AddWindow(Handle.l, ProcessID.l, Name.s, ClassName.s)
If Name = SucheName1.s And Ja = 0
Ja = 10
KillProg.l = Handle
EndIf
If ClassName = SucheName2.s And Ja = 10
MyID1 = Handle
Ja = 0
EndIf
EndProcedure
Procedure EnumAllSubChilds(Handle.l)
If Handle
EnumChildWindows_(Handle, @EnumProc(), 0)
EndIf
EndProcedure
Procedure EnumProc(Handle.l, lParam.l)
Protected Window.Window
Window\Process = 0
GetWindowThreadProcessId_(Handle, @Window\Process)
Window\Name = GetTitle(Handle)
Window\Class = GetClassName(Handle)
AddWindow(Handle, Window\Process, Window\Name, Window\Class)
EnumAllSubChilds(Handle)
ProcedureReturn #True
EndProcedure
Procedure EnumAllWindows()
Protected TmpL.l
TmpL = EnumWindows_(@EnumProc(), 0)
EndProcedure
ProcedureDLL catch_My(hwnd.l,hinst.l,lpCmdLine.s,nCmdShow.l)
EnumAllWindows()
If MyID1 = 0 ; Or MyID3 = 0
MessageRequester("error","Abzufangende Anzeige ID" + Chr(13) + "nicht gefunden." + Chr(13) + "Starte zuerst die Haupt Datei",0)
Else
SendMessage_(MyID1,#LB_GETTEXT,0,Buffer.s)
PostMessage_(MyID1,388,0,0)
MessageRequester("DLL", "Ich bin die DLL" + Chr(13) + "Und holte mir selbständig den Text" + Chr(13) + Chr(13) + Buffer.s , 0)
ReturnString$ = Buffer.s
Buffer.s = ""
ProcedureReturn ReturnString$
EndIf
EndProcedure