WIN API Unhandled exception

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by SHiNiGaMi, 23 Oct 2010.

  1. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    Добрый день. Недавно начал изучать WIN API по учебнику 2006 года(лучше не нашел). были несоответствия, но пока все выруливал. Вот исходник программы
    Code:
    #include <windows.h>
    #include <windowsx.h>
    #include <commctrl.h>
    #include "resource.h"
    #pragma comment(lib, "comctl32.lib")
    
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    BOOL OnCreate(HWND, LPCREATESTRUCT);
    void OnCommand(HWND,int,HWND,UINT);
    void OnPaint(HWND);
    void OnRButtonDown(HWND,BOOL,int,int,UINT);
    int is_red = 0;
    HINSTANCE hI;
    HBRUSH hRedBrush, hGreenBrush;
    MSG msg;
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
    {
    	HWND hwnd;
    	WNDCLASSEX wc;
    	hI = hInst;
    
    	memset(&wc,0,sizeof(wc));
    	wc.hInstance = hInst;
    	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hIcon = LoadIcon(NULL, IDI_HAND);
    	wc.lpfnWndProc = WndProc;
    	wc.lpszClassName = L"MainWindow";
    	wc.style = CS_HREDRAW|CS_VREDRAW;
    	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
    	wc.hIconSm = LoadIcon(hInst, IDI_APPLICATION);
    	wc.cbSize = sizeof(wc);
    	RegisterClassEx(&wc);
    	hwnd = CreateWindow(L"MainWindow",L"Окно пользователя",WS_OVERLAPPEDWINDOW,100,100,500,300,HWND_DESKTOP,NULL,hInst,NULL);
    	ShowWindow(hwnd,nCmdShow);
    	UpdateWindow(hwnd);
    
    	while(GetMessage(&msg,NULL,0,0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return 0;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg)
    	{
    	case WM_DESTROY: PostQuitMessage(0);
    		             break;
    	HANDLE_MSG(hwnd,WM_COMMAND,OnCommand);
    	HANDLE_MSG(hwnd,WM_PAINT,OnPaint);
    	HANDLE_MSG(hwnd,WM_RBUTTONDOWN,OnRButtonDown);
    	HANDLE_MSG(hwnd,WM_CREATE,OnCreate);
    	default: return DefWindowProc(hwnd, msg, wParam, lParam);
    	}
    	return 0;
    }
    
    void OnPaint(HWND hwnd)
    {
    	PAINTSTRUCT ps;
    	HDC hdc = BeginPaint(hwnd,&ps);
    	if(is_red==1)
    		FillRect(hdc,&ps.rcPaint,hRedBrush);
    	else if(is_red==2)
    		FillRect(hdc,&ps.rcPaint,hGreenBrush);
    	EndPaint(hwnd,&ps);
    }
    
    void OnCommand(HWND hwnd, int id, HWND, UINT)
    {
    	switch(id)
    	{
    	case ID_MAIN_ONE: is_red = 1;
    		              InvalidateRect(hwnd,NULL,TRUE);
    		              break;
            case ID_MAIN_TWO: is_red = 2;
    		              InvalidateRect(hwnd,NULL,TRUE);
    		              break;
            case ID_MAIN_THREE: DestroyWindow(hwnd);
    		              break;
    	}
    }
    
    BOOL OnCreate(HWND hwnd, LPCREATESTRUCT)
    {
    	hGreenBrush = CreateSolidBrush(RGB(100,255,100));
    	hRedBrush = CreateSolidBrush(RGB(255,100,100));
    	TBBUTTON tbb[3];
    	ZeroMemory(&tbb, sizeof(tbb));
    	for(int i=0;i<sizeof(tbb)/sizeof(TBBUTTON);i++)
    	{
    		switch(i)
    		{
    		case 0: tbb[i].idCommand = ID_MAIN_ONE;
    			    break;
    		case 1: tbb[i].idCommand = ID_MAIN_TWO;
    			    break;
    		case 2: tbb[i].idCommand = ID_MAIN_THREE;
    				break;
    		}
    		tbb[i].fsState = TBSTATE_ENABLED;
    		tbb[i].iBitmap = i;
    	}
    	CreateToolbarEx(hwnd,WS_CHILD|WS_BORDER|WS_VISIBLE,-1,3,hI,IDB_BITMAP1,tbb,3,16,16,16,16,sizeof(TBBUTTON));
    	return TRUE;
    }
    
    void OnRButtonDown(HWND hwnd,BOOL , int x, int y, UINT)
    {
    	LPCWSTR str1 = L"Красный фон";
    	LPCWSTR str2 = L"Зеленый фон";
    	LPCWSTR str3 = L"Выход";
    	RECT rect;
    
    	HMENU hTrackPopup = CreatePopupMenu();
    	AppendMenu(hTrackPopup,MF_STRING,ID_MAIN_ONE,str1);
    	AppendMenu(hTrackPopup,MF_STRING,ID_MAIN_TWO,str2);
    	AppendMenu(hTrackPopup,MF_SEPARATOR,0,NULL);
    	AppendMenu(hTrackPopup,MF_STRING,ID_MAIN_THREE,str3);
    	GetWindowRect(hwnd,&rect);
    	TrackPopupMenu(hTrackPopup,TPM_LEFTALIGN|TPM_LEFTBUTTON,msg.pt.x,msg.pt.y,0,hwnd,NULL);
    }
    
    При запуске выскакивает окно с ошибкой:
    Code:
    Unhandled exception at 0x5d5c7f36 in Only_brains.exe: 0xC0000005: Access violation reading location 0x0092fffc.
    
    Указатель ставит на строке:
    Code:
    hwnd = CreateWindow(L"MainWindow",L"Окно пользователя",WS_OVERLAPPEDWINDOW,100,100,500,300,HWND_DESKTOP,NULL,hInst,NULL);
    
    Что посоветуете?
     
    #1 SHiNiGaMi, 23 Oct 2010
    Last edited: 23 Oct 2010