Bimbol Temat założony przez niniejszego użytkownika |
[WinAPI] Problem z odczytem » 2014-01-04 02:19:02 Witam, uczę się WinAPI z kursi na tej stronie. Napotkałem drobny problem podczas odczytu, a mianowicie: LPSTR Bufor; DWORD dwRozmiar, dwPrzeczyt; HANDLE hPlik;
hPlik = CreateFile( L"test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL ); if( hPlik == INVALID_HANDLE_VALUE ) { MessageBox( NULL, L"Nie można otworzyć pliku.", L"A to pech!", MB_ICONEXCLAMATION ); PostQuitMessage( 0 ); }
dwRozmiar = GetFileSize( hPlik, NULL ); if( dwRozmiar == 0xFFFFFFFF ) { MessageBox( NULL, L"Nieprawidłowy rozmiar pliku!", L"Niedobrze...", MB_ICONEXCLAMATION ); PostQuitMessage( 0 ); } Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); if( Bufor == NULL ) { MessageBox( NULL, L"Za mało pamięci!", L"Ale wiocha...", MB_ICONEXCLAMATION ); PostQuitMessage( 0 ); }
if( !ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ) ) { MessageBox( NULL, L"Błąd czytania z pliku", L"Dupa blada!", MB_ICONEXCLAMATION ); PostQuitMessage( 0 ); } else MessageBox( NULL, L"Pomyślnie odczytano dane z pliku!", L"Sukces!", MB_ICONEXCLAMATION );
Bufor[ dwRozmiar ] = 0; SetWindowText( okno,( LPCWSTR ) Bufor );
GlobalFree( Bufor ); CloseHandle( hPlik );
W tym fragmencie: SetWindowText( okno,( LPCWSTR ) Bufor );
Muszę konwertować Bufor do LPCWSTR, dzięki czemu program się uruchamia, ale tekst okienka wcale sie nie zmienia na ten co jest w pliku, tylko na jakieś kwadraty. Z kolei, gdy używam SetWindowTextA , by nie konwertować LPSTR do LPCWSTR, to nie wyświetla się nic w nazwie okna. EDIT. Dodam, że korzystam z VS 2012 |
|
Monika90 |
» 2014-01-04 07:44:39 Twój program jest kompilowany w trybie UNICODE, jak chcesz możesz przejść na ANSI - usuń definicję makra UNICODE z opcji projektu. Ale możesz też pozostać przy unikodzie, wtedy, jak nie chcesz mieć "kwadratów" to tekst w pliku powinien używać kodowania UTF-16 little endian, a zero kończące bufor powinno być typu wchar_t (tzn. dwa bajty równe zero, a nie tylko jeden). Pamiętaj, że w plikach UTF-16 często pierwszym znakiem jest BOM (czyli byte order mark). Z kolei, gdy używam SetWindowTextA, by nie konwertować LPSTR do LPCWSTR, to nie wyświetla się nic w nazwie okna. |
A to powinno działać, jeżeli plik zawiera tekst ANSI. A w ogóle, czy wiesz co to znaczy LPCWSTR? |
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2014-01-04 14:58:18 A w ogóle, czy wiesz co to znaczy LPCWSTR? |
Jest to wskaźnik na stałego wchara. Dzięki za odpowiedź, posprawdzam to i najwyżej z edytuje posta. EDIT. Zmieniłem kodowanie na ANSI i teraz działa kod z kursu jak należy. Mimo to dalej nie wpisywało niczego do pliku. Okazało się, że to kwestia uprawnień, muszę uruchamiać plik jako administrator po skompilowaniu. |
|
« 1 » |