2010-02-01 13 views
16

Integruję zestaw SDK innej firmy oparty na C z moją aplikacją .NET. Aplikacja będzie działać jako usługa Windows na serwerze, więc nie powinna w żaden sposób wchodzić w interakcję z użytkownikiem.Jak zapobiec wyświetlaniu MessageBox przez bibliotekę stron trzecich?

Niestety, w pewnych warunkach błędu nalega na wywołanie MessageBoxA, prawdopodobnie w celu zgłoszenia, że ​​stało się coś złego. W takim przypadku usługa przestaje odpowiadać. Zgaduję, że czeka na kogoś, kto nacisnął Ok?

Nie jest możliwe, aby sprzedawca zmienił dla mnie kod.

Czy istnieje sposób, w jaki mogę wywołać to połączenie w trybie bez powiadomienia, aby mój kod mógł automatycznie zająć się sytuacją?

EDYCJA: Może być ważne, aby wspomnieć, że w moim szczególnym przypadku usługa automatycznie uruchomi się ponownie, jeśli ulegnie awarii. Zgrabne (jak to możliwe) i nagłe wyjście jest prawdopodobnie najlepszą rozdzielczością dla sytuacji, w której w moim przypadku wyświetlany jest komunikat MessageBox.

+9

Nie jest to prawdziwa odpowiedź, którą znam, ale znajduję lepszą bibliotekę/usługę. Jeśli biblioteka ma tego typu problemy, może mieć więcej. –

+0

Pamiętam, że mój były idiota, ex-co-worker, umieścił w skrzynce z wiadomościami kod, który był znany jako usługa.Powiedziałem mu, żeby go usunął, ale on nadal to zostawił i musieliśmy ponownie opublikować oprogramowanie ... nie było dobrze. – Tim

+0

Nie, powiedz, że to nie jest MessageBox z biblioteki !!!! Dobre pytanie –

Odpowiedz

10

Sprawdź Detours from Microsoft Research. Pozwala to obrać dowolne funkcje Windows API. Wymagane jest programowanie w C/C++, aby działało. Nie będziesz potrzebować wiele.

+0

Wow, nie wiedziałem, że możesz to zrobić. – Jeremy

+2

@nobugz Jesteś jak biblioteka. Poważnie. –

+0

Czytałem odpowiedzi nobugza tutaj i na forach MSDN, i jestem przekonany, że to Dave Cutler. –

3

Możesz użyć edytora, aby znaleźć lokalizację tego i usunąć wywołanie z pliku binarnego. Ale to może, ale nie musi być dozwolone w ramach ograniczeń użytkowania z oprogramowaniem. Z pewnością, jeśli prześlesz go ponownie, może to spowodować problemy - powinieneś poprosić sprzedawcę i zgłosić go jako wadę i zasugerować, że masz obejście dla własnego użytku.

Dla ludzi, którzy używali tego typu rzeczy (licencje na łamanie zabezpieczeń lub inne inżynieria wsteczna), jest to dość proste, ale prawdziwe pytanie brzmi: co się stanie, jeśli zostanie zignorowane - czy nadal działa?

+1

Awaria w tym przypadku jest OK. O wiele gorsze jest zawieszenie się usługi. – Jeremy

+0

Cóż, jeśli wiesz, że można zatrzymać, możesz również po prostu wyjść z procesu i użyć innego systemu monitorującego, aby go przywrócić, gdy nie zostanie uruchomiony. Uniknęłbym tej złożoności, gdybym mógł i tylko zobaczyłbym, czy uda ci się uciec BEZ OPIEKANIA. A więc oczywiście kwestia prawna dotycząca dystrybucji/użytkowania? Jeśli nie znasz nikogo, kto posiada umiejętność, znam kogoś, kto mi raportował, który uwielbia odtwarzać pliki binarne. – Tim

+0

Istnieje już pewien rodzaj nadzoru - jeśli program ulegnie awarii, zostanie automatycznie uruchomiony ponownie. Dlatego tak frustrujące dla mnie jest to, że wisi! :) Jeszcze nie znam kwestii prawnych. – Jeremy

0

To nie jest łatwe. Myślę, że jedynym sposobem jest napisanie haka wiadomości, aby pułapkę wiadomości przepompowywano przez wszystkie pętle komunikatów systemu Windows w systemie. Ale nie jestem nawet pewien, czy usługa może utworzyć hak komunikatów, ponieważ nie ma dostępu do domyślnej stacji Windows z domyślnymi poświadczeniami (LocalSystem). Tak więc zadaniem nr 1 byłoby sprawdzenie, czy to faktycznie zadziała.

Ale tutaj jest szorstka szkic jak ja staram się robić to poza kontekście usług i można sprawdzić, czy ma ona zastosowanie:

  1. Stwórz okna hook do wiadomości pułapek ze wszystkich kolejek komunikatów okna na system.
  2. Przełknij wszystkie komunikaty WM_CREATE i sprawdź parametr CREATESTRUCT dla wiadomości, które mogą pochodzić z biblioteki innej firmy. Może być konieczne zalogowanie wszystkich komunikatów WM_CREATE, a następnie przeanalizowanie danych, aby zobaczyć, jak odróżnić okno dialogowe biblioteki od dowolnego innego okna dialogowego w systemie. (Wiele razy element "lpszName" różni się między implementacjami dialogowymi.)
  3. jeśli uważasz, że konkretny WM_CREATE pochodzi z twojej biblioteki, zwróć "obsłużoną" odpowiedź z haka wiadomości i nie wywołaj następnej funkcji obsługi wiadomości w łańcuchu .

To wszystko jest bardzo ryzykowne, ale jest to ścieżka, która wydaje mi się, że ma jakąkolwiek szansę dla mnie.

Powiązane problemy