
Ubs, naja solche Calbacks sind halt "Nur für erfahrene Programmierer"
Zum abschluss mal meine fertige Version zum testen:
Code: Alles auswählen
Procedure.i AllocateSharedMemory(Name.s, Size.q)
Protected HandleMap = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE|#SEC_COMMIT|#SEC_NOCACHE, 0, Size, @Name)
If HandleMap
ProcedureReturn MapViewOfFile_(HandleMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
EndIf
EndProcedure
Procedure.i ReAllocateSharedMemory(Name.s)
Protected HandleMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, @Name)
If HandleMap
ProcedureReturn MapViewOfFile_(HandleMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
EndIf
EndProcedure
Procedure ReceiveCopyData(hWnd, Msg, wParam, lParam)
Protected *CopyData.COPYDATASTRUCT
Select Msg
Case #WM_COPYDATA
*CopyData.COPYDATASTRUCT = lParam
Debug "RECEIVE: "+PeekS(*CopyData\lpData)
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure SendCopyData(WindowID, Text.s)
Protected CopyData.COPYDATASTRUCT, Window.i
CopyData\cbData = StringByteLength(Text) + SizeOf(Character)
CopyData\lpData = @Text
Window = OpenWindow(#PB_Any, 0, 0, 0, 0, "", #PB_Window_Invisible)
SendMessage_(WindowID, #WM_COPYDATA, WindowID(Window), @CopyData)
While WindowEvent() : Wend
EndProcedure
Procedure FirstInstanceWindowID(Name.s, WindowID.i)
Protected MutexName.s = "MUTEX_"+MD5Fingerprint(@Name, StringByteLength(Name))
Protected MemoryName.s = "MEMORY_"+MD5Fingerprint(@Name, StringByteLength(Name))
Protected Result = CreateMutex_(0, 0, @MutexName)
Protected *Buffer.Integer
If Result
If GetLastError_() = #ERROR_ALREADY_EXISTS
ReleaseMutex_(Result)
*Buffer = ReAllocateSharedMemory(MemoryName)
ProcedureReturn *Buffer\i
Else
*Buffer = AllocateSharedMemory(MemoryName, SizeOf(Integer))
*Buffer\i = WindowID
ProcedureReturn #Null
EndIf
EndIf
EndProcedure
; Beispiel
;----------
OpenWindow(1, 0, 0, 200, 200, "Fenster", #PB_Window_Invisible|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
SetWindowCallback(@ReceiveCopyData(), 1)
WindowID = FirstInstanceWindowID("Fenster", WindowID(1))
If WindowID
SendCopyData(WindowID, "Hallo Welt")
End
Else
HideWindow(1, #False)
EndIf
Debug "Hallo Welt"
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Einfach zwei mal starten
Das ich das CopyData im WaitWindowEvent() bekommen würde, wäre mir aber lieber
