2010-01-29 6 views
5

Mamy uruchomioną usługę Windows i mamy również aplikację konsolową, której używamy do skonfigurowania tej usługi, mamy również opcję, aby zobaczyć rejestrowany dziennik.Aplikacja konsolowa do komunikacji z usługą Windows

Bardzo brzydką rzeczą jest to, że ta komunikacja jest dokonywana przez plik tekstowy, aplikacja konsoli zapisuje do pliku tekstowego, a usługa odczytuje go i na odwrót.

Co byś użył do tej komunikacji? Protokół TCP/IP nie jest opcją, ponieważ aplikacja konsoli będzie używana tylko dla usługi uruchomionej lokalnie.

Windows API SendMessage powinno być na najlepszej drodze?

dziękuję!

Odpowiedz

6

Polecam WCF jako pierwszą rzecz do rozważenia dla wszystkich komunikatów w systemie Windows, jeśli używasz .net, ponieważ jest zbudowany na tego typu rzeczy i jest stosunkowo łatwy w użyciu. Ponieważ wykluczasz TCP, sugeruję użycie Named Pipes Binding.

Dostępnych jest również kilka komunikatów windowsowych dla komunikatorów wewnątrz-maszynowych. Named Pipes (jak wspomniano), MailSlots, Shared Memory (Memory Mapped files) itd.

Moja sugestia to użycie nazwanych potoków z WCF lub natywnie.

0

Współdzielona pamięć? Aby uzyskać artykuł na temat Codeproject, zobacz artykuł here, tutaj jest inny artykuł o tej samej witrynie z numerem fastipc. Istnieje blog opisujący, jak używać memory mapped file do udostępniania za pomocą otoki.

Mam nadzieję, że to pomoże, Pozdrawiam, Tom.

1

Mniej ryzykujesz zakleszczeń, jeśli używasz nieblokujących metod przekazywania komunikatów. PostMessage lub SendNotifyMessage są lepsze niż SendMessage, ponieważ nie blokują wywołującego.

Ale zależą one od usługi mającej uchwyt okna. Czy to?

Możesz również użyć wiadomości WM_COPYDATA, aby przekazać więcej niż tylko wParam a lParam. Jeśli użyjesz tego komunikatu z PostMessage, musisz uważać, aby nie zwolnić pamięci, dopóki odbiornik nie zakończy pracy. Najbezpieczniej jest używać SendMessage dla WM_COPYDATA.

+0

+1 - Nie jestem pewien, co OP używa do ich kodowania, ale użyłem WM_COPYDATA PostMessage do komunikacji między procesami w przeszłości. Jeśli pamięć jest przypisana w prawo, ustawiasz ją, aby odbiornik zwolnił ją po odebraniu wiadomości. To powoduje, że jest on asynchroniczny. – ChrisBD

+0

Należy zauważyć, że podejście "PostMessage" kończy się niepowodzeniem w systemie Vista, a później w niektórych okolicznościach z powodu izolacji sesji 0 - patrz np. http://blogs.technet.com/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx –