2013-02-05 12 views
6

Mam problem, który występuje podczas zamykania systemu. Mam fragment kodu napisany w C++, który jest zawijany w plik .dll i wstrzykiwany do innych aplikacji. Robi kilka rzeczy, w tym uruchomienie innej aplikacji (serwera) napisanej w języku C#.W systemie Windows C++ lub C# można zapytać system operacyjny, czy aktualnie wyłącza/restartuje/wylogowuje.

Jednak po zainicjowaniu zamknięcia, kod C++ uruchamia aplikację C#, ponieważ została ona zabita przez zamknięcie, która natychmiast ulega awarii, ponieważ system wkrótce się wyłączy.

Następnie pole błędu zatrzymuje zamykanie, dopóki użytkownik nie zajmie się nim, co jest denerwujące. Czy istnieje sposób, aby zapytać system operacyjny: "Hej, zamykasz/restartujesz/wylogowujesz się?" więc nie zaczynam aplikacji, kiedy to się dzieje? Przypuszczam, że rozwiązanie na obu końcach byłoby w porządku.

== EDIT ==

Za trochę więcej wyjaśnień. Kod działający jako plik .dll, nie może zakładać, że aplikacja, do której został wprowadzony, ma jakiekolwiek "okno". Chciałbym też zapytać o coś, a nie o wydarzenie, którego muszę słuchać, ponieważ mogę przegapić to wydarzenie z powodu wyczucia czasu. Zastanawiam się, czy istnieje jakikolwiek rodzaj funkcji, która będzie skutecznie dać mi coś w tym

bool IsSystemShutting(); 

i pod tym względem w opcji C# będzie pracować dla mnie, a także opcja C++. Ale w środowisku .NET framework SystemEvents.SessionEnding i SystemEvents.SessionEnded oba zdarzenia w porównaniu do właściwości. Bardzo często zdarza się, że zapisuję się na to wydarzenie PO wydarzeniu, więc nie ma mi to dobrego prawa.

Odpowiedz

4

Dla tego scenariusza przeznaczone są komunikaty WM_ENDSESSION i WM_QUERYENDSESSION. System Windows wyśle ​​te komunikaty okna do okna po zainicjowaniu procesu zamykania, restartowania lub wylogowywania.

+1

Nie jestem pewien, czy to zadziała u mnie. Wygląda na to, że musisz skonfigurować wywołanie zwrotne, aby przechwycić tę wiadomość. Mój kod jest wstrzykiwany do innej aplikacji, więc możliwe jest, że może on przechwycić tę wiadomość, a ja jej nie otrzymam. Naprawdę nie chcę być informowany, gdy system operacyjny się wyłącza, chcę zapytać o mój własny harmonogram. Czy to możliwe, czy też to połączenie jest jedyną drogą. Ponadto rezyduję w procesach, które nie mają okien. Czy to będzie problem z tą metodą? – Ultratrunks

+0

Zawsze możesz utworzyć plik wykonywalny singleton, który spawnuje ukryte okno i utrzymuje stan zamknięcia (przy użyciu tych dwóch wiadomości) we wspólnej pamięci. Ten kod pośredni może zostać utworzony przez pierwszą instancję twojej podstawowej aplikacji. Następnie twoje aplikacje mogą zapytać o stan zamknięcia, zaglądając do wspólnej pamięci singletona. Nie jest to najprostszy kod do napisania, ale zadziała. – syazdani

Powiązane problemy