Patzick Temat założony przez niniejszego użytkownika |
[WinAPI] Problem z przerwaniem funkcji » 2009-12-20 17:24:09 Mam dialog który wywołuje funkcję INT. Jednak jest problem gdyż funkcja ta nie chce się przerwać (pewnie nie zauważam czegoś istotnego, ale nie mam już pomysłu). Dialog zaczyna się tak BOOL CALLBACK DlgLogowanie( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam ) { try { if( WczytajIloscUzytkownikow() != 1 ) {
I przechodzi mi do funkcji wczytującej, która wygląda tak: INT WczytajIloscUzytkownikow() { try { struct _finddata_t c_file; intptr_t hFile; if(( hFile = _findfirst( "Users/*.usr", & c_file ) ) == - 1L ) { throw BLAD( ERR_LOAD_USR ); _findclose( hFile ); return 0; } else { }; return 1; } catch( cEXCEPTION Wyjatek ) { Wyjatek.Msg(); }; };
I dzieje się tak: po wywołaniu nieistniejącego folderu ERR_LOAD_USR rzuca wyjątek i wyświetla się błąd. Jednak po tym funkcja powinna się zakończyć, a nie dzieje się tak i błąd wyskakuje ciągle (zwiesza działanie). Bez obsługi błędów po prostu się zawiesza, więc to nie jej wina. Dzięki za jakąś podpowiedź, jeśli ktoś wie co nie tak ;) |
|
Elaine |
» 2009-12-20 17:50:36 Pokaż całe DlgLogowanie()... |
|
Patzick Temat założony przez niniejszego użytkownika |
» 2009-12-20 18:03:05 BOOL CALLBACK DlgLogowanie( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam ) { HWND h_Combo = GetDlgItem( hwnd, IDC_COMBO_LOGOWANIE ); try { if( WczytajIloscUzytkownikow() != 1 ) { MessageBox( hwnd, "Żadne konto nie zostało znalezione. Żeby móc się zalogować najpierw załóż konto.", "Błąd logowania", MB_OK ); EndDialog( hwnd, IDOK ); } else { for( int i = 0; i < liczba_kont; i++ ) { } switch( Msg ) { case WM_INITDIALOG: { for( int i = 0; i < liczba_kont; i++ ) { SendMessage( h_Combo, CB_ADDSTRING, 0,( LPARAM ) uzytkownicy[ i ].c_str() ); } SendMessage( h_Combo, CB_SETCURSEL,( WPARAM ) Nr_logowania, 0 ); } break; case WM_COMMAND: { switch( LOWORD( wParam ) ) { case IDOK_LOGOWANIE: { } break; case IDCANCEL_LOGOWANIE: MessageBox( hwnd, "Logowanie przerwane", "Anulowane", MB_OK ); EndDialog( hwnd, IDOK_LOGOWANIE ); break; } } break; default: return FALSE; } return TRUE; } ; } catch( cEXCEPTION Wyjatek ) { Wyjatek.Msg(); }; }
Cóż nie wiem czy to coś pomaga, po tym pierwszym ifie wszystko się zwiesza. |
|
Elaine |
» 2009-12-20 18:23:55 Czyli jak myślałem - WczytajIloscUzytkownikow() rzuca wyjątek, łapiesz go, wyświetlasz komunikat i tak przy każdym wywołaniu procedury dialogu... Po rzuceniu wyjątku sterowanie wchodzi do najbliższego pasującego catch i nie wraca, więc Wczytaj...() NIGDY nie zwróci zera. Pomyśl, co z tym fantem. |
|
Patzick Temat założony przez niniejszego użytkownika |
» 2009-12-20 18:49:50 Zrozumiałem to na dwa sposoby, jednak błędne. 1. skoro po rzuceniu wyjątku wpada do pierwszego catcha zmieniłem go na catch( cEXCEPTION Wyjatek ) { Wyjatek.Msg(); return 0; };
Co w rezultacie nie zmieniło całkiem nic. 2. Jeśli jest to wina wyjątków to z całej funkcji usunąłem wyjątki i zostawiłem tak if(( hFile = _findfirst( "Users/*.usr", & c_file ) ) == - 1L ) { _findclose( hFile ); return 0; }
Co również nie przyniosło pożądanego efektu, bo w tym momencie program się po prostu bezczelnie zwiesza(czyli to samo co było bez wywalania komunikatu o błędzie) :P Może jakaś inna podpowiedź naprowadzi mnie na rozwiązanie ;) |
|
Elaine |
» 2009-12-21 11:01:24 A co ma biedak zrobić, jak nie się zwiesić? Przecież na okrągło wywołujesz to Wczytaj...(), które zwraca zero (ew. rzuca wyjątek), w reakcji na co ty wywołujesz EndDialog, które, idę o zakład (bo dokumentacja milczy, ale to MS :>), wysyła jakiś komunikat do okna, na co wywołujeszcz Wczytaj...(), które zwraca zero (ew. rzuca wyjątek), w reakcji na co ty... yadda yadda yadda. Wywołuj tę funkcję RAZ, przy WM_INITDIALOG. |
|
Patzick Temat założony przez niniejszego użytkownika |
» 2009-12-21 14:09:32 :) wielkie dzięki |
|
« 1 » |