2011-06-23 13 views
7

Wstrzykuję bibliotekę DLL do jakiegoś procesu, biblioteka DLL ma wątek roboczy, który uruchamia pętlę komunikatów.Jak poprawnie zakończyć wątek roboczy w wstrzykniętej bibliotece DLL?

Chciałbym zakończyć wątek poprawnie, tj. Wysłać wiadomość o zakończeniu (PostThreadMessage) i czekać na nią (WaitForSingleObject).

Gdzie mogę czekać na zamknięcie tego wątku? Nie mogę tego zrobić na DLL_PROCESS_DETACH, ponieważ do tego czasu wszystkie wątki są zamknięte lub zakończone i nie wiem, kiedy proces ma się zamknąć.

Moja jedyna myśl to: Czy istnieje sposób na przechwycenie pętli wiadomości głównego wątku i poszukiwanie wiadomości WM_CLOSE \ DESTROY?

Chciałbym usłyszeć wszelkie inne pomysły \ rozwiązania.

Edit:
Próbował zaczepić główny wątek korzystając SetWindowsHookEx z WH_CALLWNDPROC ale to nie działało całkiem dobrze, udało mi się zaczepić i odbierać wiadomości w wątku. Jednak nie otrzymałem wiadomości WM_QUIT tylko WM_DESTROY i WM_NCDESTROY, a wszystkie one były powiązane z oknami.

Dzięki
Omer

Odpowiedz

3

Jeśli trzeba wykonać pewne działania na „O-To-Zamknij” należy podłączyć główny wątek użyciu SetWindowsHookEx z WH_CALLWNDPROC i szukać WM_CLOSE i podjąć działania/sygnalizuje wątek do zamknięcia.

+0

Dzięki, próbując tego, brzmi jak dokładnie to, czego szukałem :) – Omer

+0

To nie działało całkiem dobrze, udaje mi się przechwycić i odebrać wiadomości wątku. Jednak nie otrzymuję wiadomości WM_QUIT tylko WM_DESTROY i WM_NCDESTROY i wszystkie są powiązane z oknami. – Omer

+0

Aby zdawać sobie sprawę z WM_QUIT, WH_CALLWNDPROC jest niewłaściwym rodzajem haka do użycia (ponieważ procedura okna nie będzie wywoływana za pomocą WM_QUIT). Musisz użyć haczyka WH_GETMESSAGE, aby zdawać sobie sprawę z WM_QUIT. –

4

Proces nie ma pojęcia, że ​​wątek istnieje, nie będzie obchodziło, czy ładnie wyjdzie. W rzeczywistości zakończy to, jeśli program zostanie napisany w, powiedzmy, C, jego biblioteka uruchomieniowa wywoła TerminateProcess, gdy jego metoda main() zostanie zakończona. Styl Harikiri.

Jeśli chcesz, aby zewnętrznie dbasz o wątek w napisanym programie, który monitoruje wątek, musisz opuścić ścieżkę nawigacyjną po jej zakończeniu. Albo przez komunikację tego z twoim programem z dowolnym mechanizmem interopera, którego używasz, jak nazwaną potokiem. Lub ustawiając nazwane wydarzenie. Upewnij się, że masz do czynienia ze scenariuszem harikiri, będziesz też chciał sprawdzić, czy uchwyt procesu zostanie zasygnalizowany, aby wskazać, że został zakończony.

+0

Dzięki, ale muszę opowiedzieć o tym wewnętrznie, spróbuję rozwiązania cprogrammera. – Omer

Powiązane problemy