2013-03-29 7 views
7

Abbiamo un sistema in cui sono in genere due processi in esecuzione sullo stesso sistema. Un processo gestisce la GUI e l'altro funziona come un servizio (sebbene per ragioni storiche, non è un servizio, ma solo un exe senza finestra visibile).È possibile tenere traccia di un messaggio Post tra i processi?

I due processi effettuano l'IPC principalmente tramite messaggi registrati in modo asincrono, ovvero utilizziamo RegisterWindowMessage() in entrambi i processi per definire un insieme di messaggi di grandi dimensioni che formino effettivamente l'API al processo del server.

Ho scritto un'applicazione di monitoraggio "hands-free" che utilizza SetWindowsHookEx() per monitorare e visualizzare le code di messaggi di entrambi i processi e fornire un certo livello di decodifica del modo in cui viene utilizzata l'API e di come le notifiche vengono propagate al Processo GUI (ogni singola finestra può iscriversi alle notifiche direttamente dal server).

Quindi, c'è un gran numero di messaggi in entrambe le direzioni, quindi ho i conteggi di filtro e di riepilogo ecc. Così posso concentrarmi su un'attività particolare. Tutto questo può essere fatto senza influenzare il codice live, che è buono.

Questo funziona tutto bene, ma ora sarebbe molto utile poter "taggare" un messaggio proveniente dalla GUI in modo da poter tracciare lo stesso messaggio quando viene elaborato dal server. Ciò sarebbe estremamente utile per il debug e la diagnosi dei problemi di sistema, ma non riesco a trovare un modo pulito (in realtà non riesco a trovare alcun modo!) Di fare questo senza aggiungere tale supporto alla nostra API dei messaggi registrati, che sarebbe molto di lavoro e comporta più rischi di quanto non mi faccia comodo al momento. Viene ulteriormente complicato dal fatto che il server pre-elabora alcuni messaggi e quindi restituisce uno PostMessage() a se stesso per eseguire l'azione, in modo che il messaggio di origine possa essere "perso".

Qualcuno qui ha affrontato questo tipo di problema? Se è così, puoi darmi qualche suggerimento? In caso contrario, ci sono modi documentati o non documentati di aggiungere un piccolo blocco di dati a un messaggio di Windows e recuperarlo in seguito? Ho guardato allo SetMessageExtraInfo() ma sembra essere per coda piuttosto che per messaggio.

+0

Se nessuno dei tuoi messaggi registrati utilizza sia 'wParam' che' lParam', puoi memorizzare i tag lì. –

+0

Grazie - ma 'wParam' e' lParam' sono ben usati :-(Infatti, l'API passa effettivamente molti dati nei messaggi tramite 'struct' in MMF, troppi dettagli da spiegare qui. vuoi incasinare quelle 'struct''s, che è il problema –

+0

Questa non è un'opzione, smetti di guardare lì. –

risposta

1

FindWindow o FindWindowEx vi fornirà i dettagli della finestra della GUI. Confronta i dettagli con il messaggio intercettato

+0

Beh, conosco entrambi gli HWND, ma non c'è nulla nel MSG struttura che posso confrontare per legare la fonte al bersaglio. La GUI invierà più messaggi per diversi motivi (ad es. Comando utente, timer ecc.) E il contenuto MSG è identico. Devo monitorare separatamente per ogni messaggio di origine. –

+0

a meno che non aggiungiamo ulteriori informazioni al messaggio, è impossibile capire l'origine. – Jack

+0

Esatto, quindi la mia domanda ;-) Preferirei non modificare la nostra API per includere informazioni di tracciamento perché sono utilizzate da terze parti. Stavo cercando forse un modo non documentato di "etichettare" un messaggio - Penso che una cosa del genere non esista, ma sono grato che hai passato un po 'di tempo a cercare di aiutarti, quindi +1 comunque. –

Problemi correlati