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

WinApi - problem z funckją FindText() opisaną w kursie na tej stronie

Ostatnio zmodyfikowano 2013-05-04 20:38
Autor Wiadomość
darek40bc
Temat założony przez niniejszego użytkownika
WinApi - problem z funckją FindText() opisaną w kursie na tej stronie
» 2013-05-04 19:18:37
Nie działa mi funkcja FindText() oraz ReplaceText(). Okno dialogowe wyszukiwania jest wyświetlane prawidłowo. Niestety Visual C++ w wyniku jakiegoś zdarzenia na tym oknie wyświetla "First-chance exception at 0x0000000f in 17 Dialog wyszukiwania.exe: 0xC0000005: Access violation.". Po chwili program przestaje działać i zostaje wyświetlony komunikat "Unhandled exception at 0x00000111 in 17 Dialog wyszukiwania.exe: 0xC0000005: Access violation.". Poniżej wklejam kod źródłowy tego programu.
C/C++
#include <windows.h>

LPSTR g_strClassWindow = "Darek";
HWND g_hWnd;
HWND g_hFindButton;

char buffer[ 80 ];

UINT WM_FINDREPLACE;

LRESULT CALLBACK WindowEventProc( HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow )
{
    WNDCLASSEX ClassWindow;
   
    ZeroMemory( & ClassWindow, sizeof( WNDCLASSEX ) );
   
    ClassWindow.cbSize = sizeof( WNDCLASSEX );
    ClassWindow.hInstance = hInstance;
    ClassWindow.lpfnWndProc = WindowEventProc;
    ClassWindow.lpszClassName = g_strClassWindow;
    ClassWindow.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    ClassWindow.hCursor = LoadCursor( NULL, IDC_ARROW );
    ClassWindow.hbrBackground =( HBRUSH ) GetStockObject( LTGRAY_BRUSH );
   
    if( !RegisterClassEx( & ClassWindow ) )
    {
        MessageBox( NULL, "Nieudana rejestracja klasy okna.", "Blad", MB_ICONERROR );
        return 1;
    }
   
    WM_FINDREPLACE = RegisterWindowMessage( FINDMSGSTRING );
   
    g_hWnd = CreateWindowEx( 0,
    g_strClassWindow,
    "Dialog wyszukiwania",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    400,
    300,
    NULL,
    NULL,
    hInstance,
    NULL );
    if( !g_hWnd )
    {
        MessageBox( NULL, "Nieudane tworzenie okna.", "Blad", MB_ICONINFORMATION );
        return 1;
    }
   
    g_hFindButton = CreateWindowEx( 0,
    "BUTTON",
    "Znajdz",
    WS_VISIBLE | WS_CHILD,
    20,
    20,
    100,
    70,
    g_hWnd,
    NULL,
    hInstance,
    NULL );
   
    ShowWindow( g_hWnd, nCmdShow );
   
    MSG Message;
    while( GetMessage( & Message, NULL, 0, 0 ) )
    {
        TranslateMessage( & Message );
        DispatchMessage( & Message );
    }
   
    return static_cast < int >( Message.wParam );
}

LRESULT CALLBACK WindowEventProc( HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
    switch( uMsg )
    {
    case WM_COMMAND:
        if(( HWND ) lParam == g_hFindButton )
        {
            FINDREPLACE fr;
            ZeroMemory( & fr, sizeof( FINDREPLACE ) );
            fr.lStructSize = sizeof( FINDREPLACE );
            fr.hwndOwner = g_hWnd;
            fr.lpstrFindWhat = buffer;
            fr.wFindWhatLen = 80;
           
            lstrcpy( buffer, "tekst" );
            FindText( & fr );
        }
        return 0;
    case WM_CLOSE:
        DestroyWindow( hWnd );
        return 0;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        return 0;
    }
   
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
P-82033
Monika90
» 2013-05-04 20:38:14
struktura typu FINDREPLACE musi istnieć przez cały czas kiedy okno jest wyświetlone, a u ciebie jest to zmienna lokalna niszczona wkrótce po wywołaniu FindText.
P-82040
« 1 »
  Strona 1 z 1