Seite 1 von 1
Structure per SendMessage übergeben Hilfe :(
Verfasst: 02.01.2014 23:48
von GronkhLP
Tach oder Abend und Frohes Neues Jahr

Ich habe zwei Proggis und will eine Kommunikationsschnittstelle via Callback und SendMessage herstellen. Reine Werte sind kein Problem, diese zu übergeben, aber wie sieht es mit Structuren aus?
Grundsätzlich sollte es kein Problem sein, weil es im WinAPI öfters gemacht wird. Zum Beispiel...
Code: Alles auswählen
point\x = 100
point\y = 200
ClientToScreen_(hWnd, @point)
Wie mache ich das mit SendMessage und Callback bei eigenen Messages, um eine eigene Structure zu senden und zu empfangen?
PS: Ich habe auch was über SharedMemory gelesen, aber möchte erstmal mit SendMessage und Callback realisieren, nur wie?

Re: Structure per SendMessage übergeben Hilfe :(
Verfasst: 03.01.2014 03:35
von NicTheQuick
Ich bin bei Windows mittlerweile etwas eingerostet, aber um Shared Memory kommst du nicht herum, denn selbst wenn du den Pointer zu einer gefüllten Struktur per SendMessage_() an ein anderes Programm übergeben bekommst, kann das andere Programme nicht auf den dahinter liegenden Speicher zugreifen.
Das heißt sobald du SharedMemory benutzen kannst, ist der Rest easy.
Re: Structure per SendMessage übergeben Hilfe :(
Verfasst: 03.01.2014 07:04
von edel
Frohes neues Gronkh und schoen das ihr endlich das UFO hinter euch gelassen habt
Unter Windows darf ein Programm nicht auf den Speicher eines anderen Programms zugreifen. Du musst also erst ein Speicherblock aus dem Ziel-Prozess holen, dort deine Werte reinschreiben und das dann an dein Fenster senden.
Beispiel (Empfaenger) :
Code: Alles auswählen
#MYMESG = #WM_USER + 1000
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Procedure Callback(hWnd, Msg, wParam, lParam)
Protected *point.POINT
If Msg = #MYMESG
*point = lParam
If *point
SetGadgetText(0, Str(*point\x))
SetGadgetText(1, Str(*point\y))
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Procedure Main()
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 60, "MyWindow")
SetWindowCallback(@callback(), 0)
TextGadget(#PB_Any, 10, 10, 40, 25, "Point\x : ")
TextGadget(#PB_Any, 10, 35, 40, 25, "Point\y : ")
TextGadget(0, 70, 10, 50, 25, "0")
TextGadget(1, 70, 35, 50, 25, "0")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
EndProcedure:End Main()
Beispiel (Sender) :
Code: Alles auswählen
#MYMESG = #WM_USER + 1000
#WINDO_TITLE = "MyWindow"
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Procedure Main()
Protected hProcess
Protected hPid
Protected hWnd
Protected WindowTitle.s = Space(1000)
Protected len
Protected mem.i
Protected pt.Point
pt\x = 424
pt\y = 565
hWnd = GetDesktopWindow_()
hWnd = GetWindow_(hWnd, #GW_CHILD)
; Fenster suchen
Repeat
hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
len = GetWindowText_(hWnd, @WindowTitle, 1000)
If len
If PeekS(@WindowTitle, len) = #WINDO_TITLE
GetWindowThreadProcessId_(hWnd, @hPid)
Break
EndIf
EndIf
Until hWnd = 0
; Nachricht senden
If hPid
hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, hPid)
If hProcess
mem = VirtualAllocEx_(hProcess, 0, SizeOf(Point), #MEM_RESERVE | #MEM_COMMIT, #PAGE_READWRITE)
If mem
WriteProcessMemory_(hProcess, mem, @pt, SizeOf(Point), #Null)
SendMessage_(hWnd, #MYMESG, 0, mem)
VirtualFreeEx_(hProcess, mem, SizeOf(Point), #MEM_RELEASE)
EndIf
CloseHandle_(hProcess)
EndIf
EndIf
EndProcedure:End Main()
Re: Structure per SendMessage übergeben Hilfe :(
Verfasst: 03.01.2014 18:40
von Derren
Wie wäre es denn, wenn du die Struktur aufteilst?
Das würde dann wie bei einem Netzwerk funktionieren, nur eben lokal.
Du sendest ein "Achtung, hier kommt Post", dann sendest du ne Menge Daten, und am Ende ein "Ok, das war's!"
Dann kannst du alles zusammen setzen und fertig.
Und falls es dir wirklich nur um Point geht (auch wenn es nur ein Beispiel war) kannst du immernoch mehrere Werte in einen Integer packen.
Re: Structure per SendMessage übergeben Hilfe :(
Verfasst: 03.01.2014 23:08
von GronkhLP
Sorry, dass ich erst jetzt dazu komme, eure Antworten zu lesen. Danke an Alle und vorallem dank an edel für den super Code, der mir auf jeden Fall weiterhilft.
