Получите необработанное исключение в 0x00f85069 - PullRequest
0 голосов
/ 21 ноября 2010

моя программа ломается и говорит это

Unhandled exception at 0x00f85069 in Monopoly.exe: 0xC0000005: Access violation writing location 0x0000000c.

я сделал оболочку win32. У меня есть два WndProc, один статический, а другой нет. статический WndProc вызывает нестатический WndProc. когда я пытаюсь получить сообщения, он работает нормально, но когда я пытаюсь установить значение для чего-то, возникает исключение. Вот мой код для двух WndProc (первый статический)

LRESULT CALLBACK Window::StaticWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) 
{ 
   if ( msg == WM_CREATE ) 
   { 
       SetWindowLongPtr( hWnd, GWLP_USERDATA, (LONG)((CREATESTRUCT *)lParam)->lpCreateParams ); 
   }
   Window *targetApp = (Window*)GetWindowLongPtr( hWnd, GWLP_USERDATA );

   return targetApp->WndProc( hWnd, msg, wParam, lParam ); 
}

LRESULT CALLBACK Window::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
    case WM_PAINT:
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_LBUTTONDOWN:
        z=-14; //IT THROW EXCEPTION
        break;
    case WM_RBUTTONDOWN:
        z-=1;
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Заранее спасибо

EDIT:
VARABILES
int z;

Ответы [ 3 ]

1 голос
/ 21 ноября 2010

Объект, для которого вы звоните WndProc, кажется, не существует (ноль?), И у вас есть нарушение прав доступа при попытке записать память в z -= 14, что this->z -= 14 ( неверный указатель). Это мое предположение.

Кроме того, нарушение прав доступа не является исключением в терминах C ++. :)

1 голос
/ 21 ноября 2010

Как вы создаете свое окно? Передали ли вы действительный указатель на экземпляр Window на функцию CreateWindow() или CreateWindowEx() через параметр lpParam? Например, если ваша оболочка окна имеет функцию Create() или что-то в этом роде:

void Window::Create()
{
    /* ... */

    // Pass a pointer to ourselves to CreateWindow() via the lpParam parameter.
    // CreateWindow() then passes that pointer to your window procedure
    // (StaticWndProc) via WM_CREATE and WM_NCCREATE in the lpCreateParams member
    // of CREATESTRUCT. This way the window procedure will know which instance to
    // call WndProc() on.
    CreateWindow(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight,
        hWndParent, hMenu, hInstance, (LPVOID)this);

    /* ... */
}
1 голос
/ 21 ноября 2010

Что ж, нарушение доступа (0xC0000005) означает, что вы получили доступ к памяти, которой у вас не должно быть.В этом случае говорится, что вы пытались написать на 0x0000000c.Поскольку вы (ваш отладчик?) Говорите, что присвоение z вызывает его, мы можем увидеть определение этого символа, пожалуйста?Кроме того, действительно ли это z = -14 или z -= 14?

Редактировать: я думаю, вам нужно заменить ((CREATESTRUCT *)lParam)->lpCreateParams действительным указателем на экземпляр class Window.

Edit #2: Что происходит так: На WM_CREATE вы устанавливаете GWLP_USERDATA на значение, которое оказывается равным NULL.Впоследствии вы читаете это значение и обрабатываете его как действительный указатель на Window, вызывая нестатическую функцию-член для этого указателя.Функции-члены класса реализованы компилятором во многом так:

LRESULT CALLBACK <mangled_name ("Window::WndProc")> (Window * const this, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    // ...
}

По этой причине вы можете вызвать функцию-член по указателю NULL.Однако, как только вы получаете доступ к переменной-члену, например z, это нарушается.Компилятор вставил код, подобный этому *((int*) (this + 0xc)) = -14, (что, кстати, означает, что z лежит в вашем экземпляре Window по 0xc байт), который с this == NULL сломался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...