Wenn man den Code bei laufendem Server-Programm dann nochmal startet, wird das Client-Programm gestartet. Das ist ein kleiner InputRequester, mit dem man Befehle an das Server-Programm schicken kann. Es gibt die folgenden Befehle:
- 'beenden' - Beendet das Serverprogramm
- 'sichtbar' - Macht das Server-Programmfenster sichtbar
- 'unsichtbar' - Macht das Server-Programmfenster unsichtbar
- etwas anderes - Schreibt den Text in das Log-Fenster des Serverprogramms
- nichts - Beendet das Client-Programm. Server-Programm läuft weiter, wenn es nicht zuvor beendet wurd.
Aber was ihr dann wirklich damit macht ist eure Sache. Viel Spaß mit dem Code. Auch wenn er nicht wirklich kommentiert ist. Aber funktionieren tut er auf jeden Fall.
Wer Speicherlecks oder nicht geschlossene Resourcen findet, bitte melden. Ich ändere das dann direkt.
Das hier ist der Code. Er stammt aus dem PBOR (PureBoard-Backup-Offline-Reader) und ist etwas abgeändert. Ich weiß leider nicht mehr, wer mir damals dabei geholfen hat.
Code: Alles auswählen
;- Variablen und Konstanten aus Common.pbi
#ProgramName = "Programm"
#Win_Main = 0
#Win_OneInstance = 1
Global NewParameter.l, Parameter.s
Global FBOR_Msg_RunOnce.l, FBOR_OneInstance_Mutex.l
Global OneInstance_AlreadyRunning.l
#FBOR_Msg_Request = 0
#FBOR_Msg_Reply = 1
FBOR_Msg_RunOnce = RegisterWindowMessage_(#ProgramName + "_Msg_RunOnce")
FBOR_OneInstance_Mutex = CreateMutex_(0, 0, #ProgramName + "_OneInstance_Mutex")
If GetLastError_() = #ERROR_ALREADY_EXISTS
OneInstance_AlreadyRunning = #True
Else
OneInstance_AlreadyRunning = #False
EndIf
Procedure OneInstance_IsRunning()
ProcedureReturn OneInstance_AlreadyRunning
EndProcedure
Procedure OneInstance_End()
ReleaseMutex_(FBOR_OneInstance_Mutex)
EndProcedure
Procedure OneInstance_Close()
CloseHandle_(FBOR_OneInstance_Mutex)
EndProcedure
Procedure OneInstance_SendParameter(Text.s)
Protected EventID.l, CopyData.COPYDATASTRUCT
If OpenWindow(#Win_OneInstance, 0, 0, 0, 0, #PB_Window_Invisible, #ProgramName)
PostMessage_(#HWND_BROADCAST, FBOR_Msg_RunOnce, #FBOR_Msg_Request, WindowID(#Win_OneInstance))
SetTimer_(WindowID(#Win_OneInstance), 0, 5000, 0)
Repeat
EventID = WaitWindowEvent()
If EventID = #WM_TIMER
Break
ElseIf EventID = FBOR_Msg_RunOnce And EventwParam() = #FBOR_Msg_Reply
CopyData\cbData = Len(Text)
CopyData\lpData = @Text
SendMessage_(EventlParam(), #WM_COPYDATA, WindowID(#Win_OneInstance), @CopyData)
Break
EndIf
ForEver
CloseWindow(#Win_OneInstance)
EndIf
EndProcedure
Procedure OneInstance_Callback(hWindow.l, Message.l, wParam.l, lParam.l)
Protected *CopyData.COPYDATASTRUCT
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_COPYDATA
*CopyData = lParam
Parameter = PeekS(*CopyData\lpData, *CopyData\cbData)
If Parameter <> ""
NewParameter = #True
EndIf
Result = #True
Case FBOR_Msg_RunOnce
If wParam = #FBOR_Msg_Request
PostMessage_(lParam, FBOR_Msg_RunOnce, #FBOR_Msg_Reply, WindowID(#Win_Main))
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
If OneInstance_IsRunning()
Repeat
Text.s = InputRequester("Info", "'sichtbar', 'unsichtbar', 'beenden' oder nichts zum Beenden.", "")
OneInstance_SendParameter(Text)
Until Text = ""
OneInstance_Close()
End
EndIf
MessageRequester("Info", "Das Server-Programm wurde gestartet.")
If OpenWindow(#Win_Main, 0, 0, 500, 200, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, #ProgramName)
SetWindowCallback(@OneInstance_Callback())
If CreateGadgetList(WindowID(0))
EditorGadget(0, 0, 0, 500, 200)
AddGadgetItem(0, -1, "Programm gestartet. Fenster sichtbar.")
Repeat
If NewParameter
NewParameter = #False
Select LCase(Parameter)
Case "sichtbar"
HideWindow(#Win_Main, 0)
AddGadgetItem(0, -1, "Fenster wieder sichtbar.")
Case "unsichtbar"
HideWindow(#Win_Main, 1)
AddGadgetItem(0, -1, "Fenster unsichtbar.")
Case "beenden" : Break
AddGadgetItem(0, -1, "Programm wieder in 3 Sekunden beendet.")
While WindowEvent() : Wend
Delay(3000)
Default
AddGadgetItem(0, -1, "Text: " + Parameter)
EndSelect
EndIf
Delay(1)
Until WindowEvent() = #PB_EventCloseWindow
EndIf
EndIf
OneInstance_End()
MessageRequester("Info", "Das Server-Programm wurde beendet.")