niedawno miałem naprawić niektóre starego kodu, który oparł się na DLL, który czasem pojawiło up asertywna wiadomość.Próbowałem wszystkie powyższe sugestie, a jedyną, nad którą pracowałem było kliknięcie przycisku Ignore. ve zaproponował uruchomienie EnumWindows w osobnym wątku - zamiast tego użyłem FindWindow.
Jest to funkcja, która znajduje komunikat popup Assert, znajduje przycisk Ignoruj w tym miejscu, a następnie klika go. To idzie w pętli, która sprawdza zmienną globalną za każdym razem (brzydki, ale szybki):
void CloseAssertBox (void *param) {
HWND window, button;
Sleep (200); //wait 200 milliseconds
while (!finishThread) { //see if we can stop checking
if ((window = FindWindow (NULL, L"Microsoft Visual C++ Runtime Library"))
&& (button = FindWindowEx (window, NULL, L"Button", L"&Ignore")))
SendMessage (button, BM_CLICK, 0, 0); //click the button
Sleep (50); //then check every 50 milliseconds
}
}
Tytuł skrzynce Assert może być inna. Jeśli Twój przycisk Ignoruj ma inne odniesienia, możesz użyć EnumChildWindows, aby uzyskać nazwę każdego elementu sterującego podrzędnego, łącznie z przyciskami.
Przed bitem kodu, który pojawia się w assert, uruchamiam nowy wątek, który wywołuje powyższą funkcję.
finishThread = 0; //this is set to 1 when the thread should finish
_beginthread (CloseAssertBox, 0, NULL); //begin the thread
Po wprowadzeniu go przez niebezpieczne assert podatne kodzie, ustawić:
finishThread = 1; //done threaded stuff
ten sposób wątek zostanie zamknięty następnym razem runda jej pętli. Prawdopodobnie istnieją lepsze sposoby na zrobienie tego.
miałem do uwzględnienia tych bibliotek, aby to działało:
#include <process.h> //for multithreading
#include <WinBase.h> //for Sleep function
int finishThread; //to tell the thread when encoding has finished
To wszystko było zrobione w Visual Studio 2010 przy użyciu biblioteki od 2006
Czy to wyzwalanie twierdzenie lub rzuca wyjątek? – Ferruccio
jest to stwierdzenie. Wyjątek nie jest problemem. –