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

[winAPI] Zapis pliku.

Ostatnio zmodyfikowano 2009-06-23 13:19
Autor Wiadomość
krdk
Temat założony przez niniejszego użytkownika
[winAPI] Zapis pliku.
» 2009-06-22 11:46:58
Skopiowałem sobie kod źródłowy ze strony darkcult.org :,
C/C++
LPSTR Bufor;
DWORD dwRozmiar, dwZapisane;
HANDLE hPlik;

hPlik = CreateFile( "test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );
if( hPlik == INVALID_HANDLE_VALUE )
{
    MessageBox( NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}

dwRozmiar = GetWindowTextLength( hwnd );
if( dwRozmiar == 0 )
{
    MessageBox( NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}

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

GetWindowText( hwnd, Bufor, dwRozmiar ); // skopiuj do bufora tekst z jakiegoś okna
Bufor[ dwRozmiar ] = 0; // dodaj zero na końcu stringa

if( !WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ) )
{
    MessageBox( NULL, "Błąd zapisu do pliku", "Dupa blada!", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}

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

ale do pliku zapisywała się nazwa okienka (:P) więc zmieniłem w funkcjach
GetWindowTextLength
 i
GetWindowText
hwnd na hText(nazwa mojej kontrolki tekstowej), lecz wtedy wyświetlał mi się błąd: "Nieprawidłowy rozmiar pliku!". Więc dodałem przed deklaracjami zmiennych :
SetWindowText( hTekst, "1" );
Program się prawidłowo uruchomił, lecz po wpisaniu tekstu do kontrolki nie zapisuje się ona do pliku. Mój aktualny kod to:
C/C++
hText = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL, 30, 30, 400, 500, hwnd, NULL, hInstance, NULL );

//(...)

SetWindowText( hText, "1" );

LPSTR Bufor;
DWORD dwRozmiar, dwZapisane;
HANDLE hPlik;

hPlik = CreateFile( "tekst.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );
if( hPlik == INVALID_HANDLE_VALUE )
{
    MessageBox( NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}

dwRozmiar = GetWindowTextLength( hText );
if( dwRozmiar == 0 )
{
    MessageBox( NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}

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

GetWindowText( hText, Bufor, dwRozmiar ); // skopiuj do bufora tekst z jakiegoś okna
Bufor[ dwRozmiar ] = 0; // dodaj zero na końcu stringa

if( !WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ) )
{
    MessageBox( NULL, "Błąd zapisu do pliku", "Dupa blada!", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}

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

Moje pytanie to: czemu się nie zapisuje?!?
P-7886
pixelmaster
» 2009-06-22 13:10:20
P-7892
krdk
Temat założony przez niniejszego użytkownika
» 2009-06-22 17:25:49
Szukałem już wcześniej, ale dałem długie słowo kluczowe i mi nie znalazło.
Ale dalej mi nie działa. Mam kod wg. tamtego przykładu, program się uruchamia lecz tekst nie zapisuje się do pliku.
P-7899
pixelmaster
» 2009-06-22 17:29:27
pokaż cały kod
P-7900
krdk
Temat założony przez niniejszego użytkownika
» 2009-06-22 21:32:54
C/C++
#include <windows.h>

HWND hwnd;
HWND hOknoText;

LPSTR NazwaKlasy = "Nazwa";
MSG Komunikat;

bool ZapiszPlik( LPSTR sNazwaPliku, HWND hOknoText )
{
    LPSTR Bufor;
    DWORD dwRozmiar, dwZapisane;
    HANDLE hPlikz;
    bool udalo_sie = false;
   
    hPlikz = CreateFile( sNazwaPliku, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 );
   
    if( hPlikz != INVALID_HANDLE_VALUE )
    {
       
        dwRozmiar = GetWindowTextLength( hOknoText );
        if( dwRozmiar == 0xFFFFFFFF )
        {
            MessageBox( NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION );
            PostQuitMessage( 0 ); //Zakończ program
        }
       
        Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
        if( Bufor == NULL )
        {
            MessageBox( NULL, "Za mało pamięci!", "Ale wiocha...", MB_ICONEXCLAMATION );
            PostQuitMessage( 0 ); //Zakończ program
        }
        GetWindowText( hOknoText, Bufor, dwRozmiar + 1 ); //skopiuj do bufora tekst z jakiegoś okna
       
        if( !WriteFile( hPlikz, Bufor, dwRozmiar, & dwZapisane, NULL ) )
        {
            MessageBox( NULL, "Błąd zapisu do pliku", "Dupa blada!", MB_ICONEXCLAMATION );
            PostQuitMessage( 0 ); //Zakończ program
        }
       
        GlobalFree( Bufor ); //Zwolnij bufor
        CloseHandle( hPlikz ); //Zamknij plik            
    }
    return udalo_sie;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASSEX wce;
    wce.cbSize = sizeof( WNDCLASSEX );
    wce.style = CS_DBLCLKS;
    wce.lpfnWndProc = WndProc;
    wce.hInstance = hInstance;
    wce.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wce.hCursor = LoadCursor( NULL, IDC_ARROW );
    wce.hbrBackground =( HBRUSH )( COLOR_WINDOW + 11 );
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.lpszClassName = NazwaKlasy;
    wce.lpszMenuName = 0;
    wce.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    if( !RegisterClassEx( & wce ) ) { MessageBox( NULL, "Nie da się stworzyć klasy", "Error", MB_OK | MB_ICONERROR ); return 1; }
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Okienko", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 470, 600, NULL, NULL, hInstance, NULL );
    hOknoText = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL, 30, 30, 400, 500, hwnd, NULL, hInstance, NULL );
   
    if( hwnd == NULL ) { MessageBox( NULL, "Nie da się stworzyć okna", "Error", MB_OK | MB_ICONERROR ); return 1; }
   
    OPENFILENAME ofn;
    char sNazwaPliku[ MAX_PATH ] = "";
   
    ZeroMemory( & ofn, sizeof( ofn ) );
    ofn.lStructSize = sizeof( ofn );
    ofn.lpstrFilter = "Pliki tekstowe (*.txt)\0*.txt\0Pliki PHP (*.php;*.php3;*.phtml)\0*.php;*.php3;*.phtml\0Wszystkie pliki\0*.*\0";
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFile = sNazwaPliku;
    ofn.lpstrDefExt = "txt";
    ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    if( GetSaveFileName( & ofn ) )
    {
        ZapiszPlik( sNazwaPliku, hOknoText );
    }
   
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );
   
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    } return Komunikat.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    return 0;
}

Nie wiem co robię źle. Z odczytem nie miałem problemów. W bibliotece fstream też mi zapis nie wychodził, ale nie chciało mi się już wtedy kombinować z tym.
P-7925
pixelmaster
» 2009-06-22 21:37:58
zrób sobie buttona a potem w wm_command jak button kliknięty zrób to
C/C++
OPENFILENAME ofn;
char sNazwaPliku[ MAX_PATH ] = "";

ZeroMemory( & ofn, sizeof( ofn ) );
ofn.lStructSize = sizeof( ofn );
ofn.lpstrFilter = "Pliki tekstowe (*.txt)\0*.txt\0Pliki PHP
( *.php; *.php3; *.phtml ) \0*.php; *.php3;
*.phtml\0Wszystkie pliki\0 *.*\0 ";
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFile = sNazwaPliku;
ofn.lpstrDefExt = "txt";
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if( GetSaveFileName( & ofn ) )
{
    ZapiszPlik( sNazwaPliku, hOknoText );
}
P-7926
krdk
Temat założony przez niniejszego użytkownika
» 2009-06-23 13:19:45
Teraz działa :):):) Wielkie dzięki.
P-7943
« 1 »
  Strona 1 z 1