creatWindow函数处出现异常0xC0000005: 执行位置 0xCCCCCCCC 时发生访问冲突。
我是初学MFC,在第一次创建window时,在creatWindow函数发生异常,一开始百度0xC0000005异常发生的原因,一般都说是因为栈溢出导致的问题,以及检查指针初始化的问题,当时代码为:
hwnd = CreateWindowW(wc.lpszClassName,
TEXT("My_First_Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
我当时猜测是hInstance或者hwnd未赋值的问题。然后又去百度各种博客和查看windows帮助文档,看到creatWindow函数原型为
void CreateWindowA(
lpClassName,
lpWindowName,
dwStyle,
x,
y,
nWidth,
nHeight,
hWndParent,
hMenu,
hInstance,
lpParam
);
发现其函数返回值为Void,与网上各种博客其返回值为HWND,然后在帮助文档中又发现creatWindowExA函数的返回值为HWND,于是将creatWindow函数换成creatWindowExA函数,发现还是出现异常,于是排除hwnd未赋值这一猜测 。一次偶然的机会,在运行出现异常时,我用鼠标去查看各个参数的值,
//1.设计窗口
WNDCLASS wc;
//ZeroMemory(&wc, sizeof(wc));//初始化wc
wc.cbClsExtra = 0;//窗口类的额外内存
wc.cbWndExtra = 0;//窗口的额外内存
wc.hbrBackground = (HBRUSH)GetStockObject(DEVICE_DEFAULT_FONT);
wc.hCursor = LoadCursor(hInstance, IDC_APPSTARTING);
wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wc.hInstance = hInstance; //应用程序实例句柄
// wc.lpfnWndProc = WindowProc; //窗口过程
wc.lpszClassName =TEXT("My_Window");//窗口类名称
wc.lpszMenuName = NULL;//菜单名称
wc.style = 0;//显示风格,0为默认风格
发现结构体wc的各值如下:
其中wc.lpfnWndProc的值为0xcccccccc,正好与异常中的执行位置0xcccccccc处发生访问冲突。这说明在创建窗口时必须为窗口指明窗口过程,这里的wc.lpfnWndProc为一个指针,指向窗口过程。