none
Не могу определить причину ошибки RRS feed

  • Вопрос

  • Здравствуйте. 

    Прочитав следующий туториал http://msdn.microsoft.com/ru-ru/library/windows/desktop/ff381400(v=vs.85).aspx , я решил сохранять данные о состоянии приложения в объекте класса, а не в статичных переменных. Однако программа теперь не работает: если запустить программу без отладки, то ничего не произойдёт, если же запустить пошаговую отладку, то возникает ошибка(на изображении). 

    Возникает ошибка на строке "if (!pState->was)". Это происходит из-за того, что указатель pState равняется NULL. Однако, насколько я понимаю, он этому значению равняться не должен. 

    Подскажите пожалуйста, в чём моя ошибка? Заранее спасибо. 

    Текст ошибки и часть кода находятся ниже. 

    class StateInfo {
    public:
    	bool was;
    	Parall out, in; 
    	StateInfo(void);
    };
    StateInfo* GetAppState(const HWND& hwnd)
    {
    	LONG_PTR ptr = GetWindowLongPtr(hwnd, GWLP_USERDATA);
    	StateInfo* pState = reinterpret_cast<StateInfo*>(ptr);
    	return pState;
    }
    
    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	StateInfo* pState;
    
    	if (uMsg == WM_CREATE) {
    		CREATESTRUCT* pCreate = reinterpret_cast<CREATESTRUCT*>(lParam);
    		pState = reinterpret_cast<StateInfo*>(pCreate->lpCreateParams);
    		SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pState);
    		return 0; //Эту строчку я добавил самостоятельно. Зря? 
    	} 
    	else
    		pState = GetAppState(hwnd);
    
    	if (!pState->was) { //Здесь возникает ошибка
    		ifstream inf("input.txt");
    		pState->out.input(inf);
    		pState->in.input(inf);
    		pState->was = true;
    	}
    
    	switch (uMsg) {
    	case WM_LBUTTONDOWN:
    		pState->out.contour(hwnd);
    		return 0;
    	case WM_RBUTTONDOWN:
    		pState->out.solid(hwnd);
    		return 0;
    	case WM_KEYDOWN:
    		pState->out.withIn(pState->in, hwnd);
    		return 0;
    	case WM_PAINT:
    	{
    		PAINTSTRUCT ps;
    		HDC update = BeginPaint(hwnd, &ps);
    		FillRect(update, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
    		EndPaint(hwnd, &ps);
    	}
    		return 0;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	case WM_CREATE:
    		return 0;
    	}
    
    	return TRUE;
    }




    • Изменено iTiPo 3 октября 2014 г. 21:20
    3 октября 2014 г. 21:19

Ответы

  • Программа падает на обработке сообщения WM_GETMINMAXINFO, которого Ваша функция окна не ждет. Вам нужно переписать код этой функции, чтобы переменная pState не использовалась в неинициализированном состоянии. Осваивайте отладчик, он все объяснит :)

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа iTiPo 6 октября 2014 г. 15:48
    5 октября 2014 г. 19:47

Все ответы

  • Вы не показали код создания объекта StateInfo. Он передается в CreateWindowEx (как написано в приведённой Вами статье)?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    4 октября 2014 г. 6:22
  • Да, объект передаётся аналогичным, приведённому в статье, способом. 

    StateInfo* stateApp = new (nothrow) StateInfo;
    HWND hwnd = CreateWindowEx(0, CLASS_NAME,
    		L"Лабораторная работа", WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    		NULL, NULL, hInstance, stateApp);


    4 октября 2014 г. 12:17
  • Выложите проект, посмотрю на досуге. Самому писать код на WinAPI скучно :)

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    4 октября 2014 г. 13:17
  • Спасибо :-)

    Вот ссылка на файлы с исходным кодом: https://bitbucket.org/iTiPo/dontwork

    P.S. Только не смейтесь над моими комментариями :-D 
    • Изменено iTiPo 4 октября 2014 г. 14:15
    4 октября 2014 г. 14:14
  • Программа падает на обработке сообщения WM_GETMINMAXINFO, которого Ваша функция окна не ждет. Вам нужно переписать код этой функции, чтобы переменная pState не использовалась в неинициализированном состоянии. Осваивайте отладчик, он все объяснит :)

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа iTiPo 6 октября 2014 г. 15:48
    5 октября 2014 г. 19:47
  • Спасибо большое :)
    6 октября 2014 г. 15:48