Я понятия не имею, почему это происходит; некоторые поисковые запросы Google заставили меня поверить, что это связано с неправильным управлением памятью, в то время как другие заявили, что это связано с недопустимым .DLL, связанным с исполняемым файлом. Я не могу понять это, потому что единственный .DLL, который я мог бы назвать недопустимым, - это мой freeglut .DLL, но это нормально работает без проблем.Нарушение права доступа на 0xccccc
Все, что я пытаюсь сделать, это создать окно.
Вопрос
Что происходит с моим кодом? Что я делаю неправильно, и как я могу это исправить?
Код
WinMain
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow) {
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
bool done;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszClassName = L"someclass";
if (!RegisterClassEx(&wc)) { //Error:
MessageBox(NULL, L"Class registration has failed!", L"Error!", MB_OK | MB_ICONINFORMATION);
return 0;
}
hwnd = CreateWindow(
L"someclass", L"someclass",
WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU,
200, 200, 400, 400, NULL, NULL, hInstance, NULL
);
if (!hwnd) {
MessageBox(NULL, L"Window Creation Failed!", L"Error!", MB_OK | MB_ICONINFORMATION);
}
done = false;
while(!done) {
PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);
if (msg.message == WM_QUIT) {
done = true;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
stdafx.h
< - прекомпилирована Заголовок
#ifndef STDAFX_H
#define STDAFX_H
#include <Windows.h>
#include <WinUser.h>
#include <GL\freeglut.h>
#endif
WndProc
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT paintstruct;
HDC hdc;
LPCWSTR str = L"Hello, World!";
switch(message) {
case WM_PAINT:
hdc = BeginPaint(hwnd, &paintstruct);
SetTextColor(hdc, COLORREF(0x00FF0000));
TextOut(hdc, 200, 200, str, sizeof(str) - 1);
EndPaint(hwnd, &paintstruct);
return 0;
break;
case WM_CLOSE:
PostQuitMessage(0);
return 0;
case WM_CREATE:
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
Официальный Ошибка
Access violation reading location 0xcccccccc.
Update
Если //Error
комментарий отмечен, по RegisterClassEx
, в if
, где происходит ошибка.
На какой строке кода происходит нарушение доступа? Это первый шаг в определении причины. –
Где происходит ошибка? '0xcc' - это символ заполнения, с которым среда выполнения отладки инициализирует стек. Эта ошибка означает, что вы используете неинициализированную переменную - возможно, указатель. –
Не могли бы вы выслать код для 'WndProc'? – Mehrdad