Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] Problem z odczytem

Ostatnio zmodyfikowano 2014-01-04 14:58
Autor Wiadomość
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:
C/C++
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 ); // Zakończ program
}

dwRozmiar = GetFileSize( hPlik, NULL );
if( dwRozmiar == 0xFFFFFFFF ) {
    MessageBox( NULL, L"Nieprawidłowy rozmiar pliku!", L"Niedobrze...", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}
Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
if( Bufor == NULL ) {
    MessageBox( NULL, L"Za mało pamięci!", L"Ale wiocha...", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}

if( !ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ) ) {
    MessageBox( NULL, L"Błąd czytania z pliku", L"Dupa blada!", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}
else
     MessageBox( NULL, L"Pomyślnie odczytano dane z pliku!", L"Sukces!", MB_ICONEXCLAMATION );

Bufor[ dwRozmiar ] = 0; // dodaj zero na końcu stringa
SetWindowText( okno,( LPCWSTR ) Bufor ); // zrób coś z tekstem, np. wyświetl go

GlobalFree( Bufor ); // Zwolnij bufor
CloseHandle( hPlik ); // Zamknij plik

W tym fragmencie:
C/C++
SetWindowText( okno,( LPCWSTR ) Bufor ); // zrób coś z tekstem, np. wyświetl go
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
P-101085
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?
P-101086
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.
P-101105
« 1 »
  Strona 1 z 1