Problem z If w WinApi C++

0

Dzień dobry!
Od rana męczę się już z instrukcją if. :( Mój problem polega na tym że odczytuję dane z wskazanego pliku ini w którym znajduje się sekcja [sekcja] oraz klucz klucz o wartości wiadomosc. Otwieram ten plik, sprawdzam przy użyciu if czy dany klucz istnieje w danym pliku i jeżeli tak to go odczytuję. Jeżeli otworzyłem dobry plik z podaną sekcją i kluczem wszystko jest pięknie - pokazuje się komunikat że wszystko w porządku. Gorzej jest jeżeli wskaże całkowicie inny plik lub plik ini bez wskazanej sekcji czy klucza. Wtedy program powinien wyświetlić błąd a pokazuje że wszystko w porządku. Dodatkowo stworzyłem pole w którym wyświetla się error czyli plik błędny lub treść klucza jeżeli to poprawny plik. Gdy wybiorę błędny plik w polu wyświetla się error ale z if pokazuje się komunikat że wszystko jest dobrze. Nie mam pojęcia co robię źle. Kod źródłowy z problemem można znaleźć tutaj: http://db.tt/5TOMkU9R (archiwum zip). Z góry dziękuje za każdą pomoc!!

2

if (Bufor==Blad)

Porównujesz tutaj wskaźniki, a nie napisy. Napisy trzeba porównać np. funkcją strcmp. W naszym przypadku - makrem _tcscmp, które dobierze odpowiednią wersję w zależności od ustawionego makra UNICODE. Twój kod nie skompiluje się nawet, gdy będzie ono ustawione. Część kodu, który skopiowałeś z internetu był pisany z myślą o kompatybilności z tymi dwoma trybami, część pisana przez ciebie tylko z ANSI.

Generalnie zasada jest taka: jeżeli chcesz wspierać systemy przed Windows XP to warto wersję ANSI również przygotować. Dobrą sprawą jest pisać kod, który skompiluje się (i będzie działać poprawnie) niezależnie od tego czy będzie ANSI czy Unicode. Trzeb tylko pamiętać, żeby w kwestii napisów nie używać char, a TCHAR; wszystkie literały tekstowe otaczać makrem TEXT, a funkcjom ze standardowej biblioteki C zmienić przedrostek na _tcs i dołączyć nagłówek tchar.h.

Więc zamieniamy tamtą linijkę na if(_tcscmp(Bufor, Blad) == 0).

Natomiast kod dalej nie jest idealny, bo wystarczy, że w pliku ini zamienimy tekst "wiadomosc" na "error". Plik będzie poprawny, ale dostaniemy komunikat o błędzie. Znajdź sobie jakiś inny parser. Te funkcje od obsługi ini są reliktem.

ps. mam wrażenie, że korzystasz z Dev-C++: wywal ten bubel.

2

Jeśli piszemy kod WinAPI'owy to raczej polecałbym korzystać z funkcji WinAPI:
Shell String Handling Functions
StrCmp function

#include <Shlwapi.h>
/* ... */
if(StrCmp(Bufor, Blad) == 0)
0

Wielkie dzięki! Teraz już rozumiem i działa :D
Tak używam Dev-C++ wiem że jest on lekko przestarzały więc co innego byście polecili? Code::Blocks? Chodzi mi oczywiście o programy darmowe.

1

Code::Blocks, Visual Studio czy nawet Vim.
Wyborów jest mnóstwo.

0

Ok dzięki bardzo. Wybrałem Code::Blocks i mam nadzieje że będzie dobrze.

0

Mam jeszcze jedno małe pytanko a nie chcę zakładać nowego tematu żeby nie zaśmiecać forum więc mam nadzieję że nikt się nie obrazi jak zapytam w tym temacie. Zainstalowałem Code::Blocks i zacząłem się trochę bawić ale nie mogę wywołać okienka dialogowego. W Dev-C++ używałem funkcji:

int dialog = DialogBox( GetModuleHandle( NULL ), MAKEINTRESOURCE( 200 ), hwnd, DlgProc );

W Code::Blocks ta funkcja chyba niestety nie działa. Dodam jeszcze że to okienko dialogowe mam napisane w pliku .rc, jego ID jest przechowywane przy pomocy pliku dialog.h w którym mam linijkę: #define ID_MOJDIALOG 200

.
0

Ale co dokładnie nie działa?

0

Dokładnie dialog mi się nie pokazuje.
Mam przycisk który wywołuje ten dialog po kliknięciu. Klikam więc i dialog się nie pokazuje. Dopisuję tuż przed poleceniem wywołującym dialog instrukcję MessageBox która ma pokazać komunikat przed dialogiem w celu sprawdzenia. Ponownie kompiluję, klikam na przycisk no i małe okienko się pokazuje a dużego okna dialogowego ani śladu. W Dev-C++ dokładnie ten sam kod działał.

1

Sprawdź co zwraca funkcja DialogBox i jaki jest kod błędu (GetLastError). Kod błędu możesz zamienić na komunikat tekstowy. Pod poniższym linkiem jest pokazane jak się to robi:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680582.aspx
Możesz przekleić całą funkcję ErrorExit do swojego projektu i wywołać ją zaraz po DialogBox.

Najprawdopodobniej plik zasobów .rc nie został wkompilowany w exe'ka. Masz w ogóle ten .rc dołączony do projektu? Podczas kompilacji w oknie komunikatów kompilatora powinno się wyświetlić compiling plik_zasobow.rc czy coś takiego.

0

Skopiowałem kod z MSDN, potem po DialogBox wywołałem tą funkcje i po wciśnięciu przycisku wywołującego okienko pojawia mi się takie coś: http://db.tt/X6aDMSjd . A i podczas kompilacji pojawia się compiling: okienko1.rc więc ja już nie wiem co może być nie tak... :(

Ok już jest w porządku :) Dziękuje za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1