Cześć ostatnio bawię się trochę z obsługą plików w WinAPI. I mam pewien problem. Konkretnie nie mogę otworzyć pliku przy próbie zapisu danych. Zamieszczam kod. Byłbym wdzięczny gdyby ktoś mi pomógł.
#include <Windows.h>
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
void file_open( HWND );
void file_write( HWND );
HWND hWnd;
HWND hText;
HWND hStatic;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
WNDCLASSEX wc;
ZeroMemory( & wc, sizeof( WNDCLASSEX ) );
wc.cbSize = sizeof( WNDCLASSEX );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = L"class";
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx( & wc );
hWnd = CreateWindowEx( NULL,
L"class", L"Pliki",
WS_OVERLAPPEDWINDOW,
0, 0,
640, 480,
NULL, NULL,
hInstance, NULL );
hText = CreateWindowEx( WS_EX_CLIENTEDGE,
L"EDIT", NULL,
WS_CHILD | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | WS_VISIBLE,
10, 10,
200, 200,
hWnd, NULL,
hInstance, NULL );
hStatic = CreateWindowEx( WS_EX_CLIENTEDGE,
L"STATIC", NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER,
300, 10, 100, 100,
hWnd, NULL,
hInstance, NULL );
ShowWindow( hWnd, nCmdShow );
MSG msg;
while( TRUE )
{
while( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( & msg );
DispatchMessage( & msg );
}
if( msg.message == WM_QUIT ) break;
}
return msg.wParam;
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_DESTROY:
{
PostQuitMessage( 0 );
return 0;
} break;
case WM_COMMAND:
{
if(( HWND ) lParam == hText )
file_write( hText );
file_open( hStatic );
} break;
}
return DefWindowProc( hWnd, message, wParam, lParam );
}
void file_open( HWND hStatic )
{
LPSTR buffer;
DWORD size, read;
HANDLE hFile;
hFile = CreateFile( L"file.txt", GENERIC_READ , 0 , NULL, OPEN_EXISTING , 0, NULL );
size = GetFileSize( hFile, NULL );
buffer =( LPSTR ) GlobalAlloc( GPTR, size + 1 );
ReadFile( hFile, buffer, size, & read, NULL );
buffer[ size ] = 0;
SetWindowTextA( hStatic, buffer );
GlobalFree( buffer );
CloseHandle( hFile );
}
void file_write( HWND hText )
{
LPSTR Bufor;
DWORD dwRozmiar, dwZapisane;
HANDLE hPlik;
hPlik = CreateFile( L"file.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL );
if( hPlik == INVALID_HANDLE_VALUE )
{
MessageBox( NULL, L"Nie można otworzyć pliku.", L"A to pech!", MB_ICONEXCLAMATION );
PostQuitMessage( 0 );
}
dwRozmiar = GetWindowTextLength( hText );
if( dwRozmiar == 0 )
{
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 );
}
GetWindowTextA( hText, Bufor, dwRozmiar );
Bufor[ dwRozmiar ] = 0;
if( !WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ) )
{
MessageBox( NULL, L"Błąd zapisu do pliku", L"Dupa blada!", MB_ICONEXCLAMATION );
PostQuitMessage( 0 );
}
GlobalFree( Bufor );
CloseHandle( hPlik );
}