2013-03-29 16 views
7

Mamy system, w którym zazwyczaj są dwa procesy uruchomione w tym samym systemie. Jeden proces obsługuje GUI, a inne działa jak usługa (choć z przyczyn historycznych nie jest usługą, tylko exe bez widocznego okna).Czy można śledzić PostMessage między procesami?

Dwa procesy podejmują IPC głównie za pośrednictwem zarejestrowanych wiadomości asynchronicznie - tj. Używamy RegisterWindowMessage() w obu procesach w celu zdefiniowania dużego zestawu komunikatów, które skutecznie tworzą interfejs API dla procesu serwera.

Napisałem "bezobsługową" aplikację monitorującą, która używa SetWindowsHookEx() do monitorowania i wyświetlania kolejek komunikatów obu procesów oraz zapewnia pewien poziom dekodowania sposobu, w jaki API jest wykorzystywane i w jaki sposób powiadomienia są propagowane do Proces GUI (każde pojedyncze okno może subskrybować powiadomienia bezpośrednio z serwera).

Tak więc, istnieje duża liczba wiadomości w obu kierunkach, więc mam filtrowanie i podsumowania itp., Więc mogę skupić się na konkretnej aktywności. Wszystko to można zrobić bez wpływu na kod na żywo, co jest dobre.

Wszystko działa dobrze, ale teraz bardzo przydatna byłaby możliwość "oznaczenia" wiadomości pochodzącej z GUI, dzięki czemu mogę śledzić tę samą wiadomość, gdy jest przetwarzana przez serwer. Byłoby to niezwykle przydatne do debugowania i diagnozowania problemów systemowych, ale nie mogę znaleźć czystej drogi (właściwie nie mogę znaleźć!) Robienia tego bez dodawania takiego wsparcia do naszego zarejestrowanego interfejsu API wiadomości, który byłby dużo pracy i wiąże się z większym ryzykiem, niż jestem w tej chwili zadowolony. Dodatkowym utrudnieniem jest fakt, że serwer przetwarza wstępnie niektóre wiadomości, a następnie wykonuje je ponownie, aby komunikat początkowy mógł zostać "utracony".

Czy ktoś tutaj rozwiązał ten problem? Jeśli tak, czy możesz mi podać jakieś wskazówki? Jeśli nie, to czy istnieją jakieś udokumentowane lub nieudokumentowane sposoby dodania małego bloku danych do wiadomości systemu Windows i pobrania go później? Spojrzałem na SetMessageExtraInfo(), ale wydaje się, że jest to kolejka zamiast per-message.

+0

Jeśli żaden z Twoich zarejestrowanych wiadomości nie używa zarówno 'wParam', jak i' lParam', możesz tam przechowywać swoje tagi. –

+0

Dzięki - ale 'wParam' i' lParam' są dobrze wykorzystane :-(W rzeczywistości API przekazuje dużo danych w wiadomościach za pośrednictwem 'struct' w FRP, zbyt wiele szczegółów do wyjaśnienia tutaj. chcesz zepsuć te "struct", co jest problemem –

+0

To nie jest opcja, przestań tam patrzeć –

Odpowiedz

1

FindWindow lub FindWindowEx poda szczegóły okna GUI. Porównaj szczegóły z wiadomością przechwyconą

+0

Cóż, znam oba urządzenia HWND, ale nie ma w MSG nic strukturę, którą mogę porównać, aby powiązać źródło z celem. GUI będzie wysyłać wiele wiadomości z różnych powodów (na przykład polecenie użytkownika, zegar itp.), A treść MSG jest identyczna. Muszę śledzić osobno dla każdej wiadomości początkowej. –

+0

, chyba że dodamy do wiadomości dodatkowe informacje, niemożliwe jest ustalenie pochodzenia. – Jack

+0

Zgadza się - stąd moje pytanie ;-) Wolałbym nie zmieniać naszego API, żeby zawierał informacje o śledzeniu, ponieważ jest używany przez strony trzecie. Szukałem prawdopodobnie nieudokumentowanego sposobu "oznaczania" wiadomości - myślę, że czegoś takiego nie ma, ale jestem wdzięczny, że poświęciłeś trochę czasu, próbując pomóc, więc tak czy inaczej +1. –

Powiązane problemy