主题:[讨论]Access Violation(非法访问)
yjlh1234
[专家分:420] 发布于 2006-03-15 20:06:00
小弟日前在做一windows程序
发现程序调试时出现 Access Violation!
知是非法访问一块无效内存
但是出现提示的竟是在
hwnd=CreateWindow(szAppName,TEXT("my frist WIN32 program "),WS_POPUP,0,0,1024,768,NULL,NULL,hInstance,NULL);
我急忙复制下程序的主要部分到另一工程 问题消失了~
但是回头调试当前工程时 还是出现同样的问题!
为什么呢?
达人指教
回复列表 (共11个回复)
沙发
yjlh1234 [专家分:420] 发布于 2006-03-15 20:16:00
错误代码如下:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("my frist Windows Program");
HWND hwnd; //定义窗口
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
//wndclass.hIcon=LoadIcon(NULL,NULL);
wndclass.hIcon=LoadIcon(NULL,(LPCTSTR)IDI_ICON1);
wndclass.lpszClassName=szAppName;
if (!RegisterClass(&wndclass))//注册窗口
{return 0;
}
//-------创建窗口(******该处出错********)
hwnd=CreateWindow(szAppName,TEXT("my frist WIN32 program "),WS_POPUP,0,0,1024,768,NULL,NULL,hInstance,NULL);
//——————(******该处出错********)
Hand_Window=hwnd;
Hinstance=hInstance;
ShowWindow(hwnd,1); //显示窗口 0表示以隐藏模式 1是以窗口模式
UpdateWindow(hwnd); //刷新用户区
if (!InitDDraw())
{ MessageBox(hwnd,TEXT("初始化Direct表面出错!"),"ERROR",MB_OK);
SendMessage(hwnd,WM_DESTROY,NULL,NULL);
}
else if(!Init_File())
{MessageBox(hwnd,TEXT("文件解析出错!"),"ERROR",MB_OK);
SendMessage(hwnd,WM_DESTROY,NULL,NULL);
}
while (1)
{
while(GetMessage(&msg,NULL,0,0))
{TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
为什么呢????
板凳
yjlh1234 [专家分:420] 发布于 2006-03-16 16:13:00
消息循环处理函数太长会引起该错误吗?
因为我又试试将消息处理改得较短,发现问题消失了!
为什么呢? 是消息处理函数里面有错吗??
3 楼
yjlh1234 [专家分:420] 发布于 2006-03-16 16:31:00
错误已经被小弟解决了
是因为自定义消息与系统消息标号冲突!
难道创建窗体的时候 编译器会去 检查消息处理函数是否有错?
4 楼
semker [专家分:4130] 发布于 2006-03-17 09:59:00
while (1) //这不是死循环了吗?
{
while(GetMessage(&msg,NULL,0,0))
{TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
5 楼
yjlh1234 [专家分:420] 发布于 2006-03-17 18:04:00
不是的
好象是将消息锁定在自己的程序里
不让其他应用程序获得消息
能加快速度吧(鄙人愚见)
其实能在接收到WM_DESTROY是退出来 不必担心死循环
6 楼
semker [专家分:4130] 发布于 2006-03-22 17:00:00
很不明白在接收到WM_DESTROY是怎么退出的,能说一下吗?
7 楼
yjlh1234 [专家分:420] 发布于 2006-03-23 15:28:00
我也不大清楚
可能就象 控制台程序中的 exit()吧
WM_DESTROY可能是将控制权交给操作系统吧
不知道对不对
高手指教
8 楼
semker [专家分:4130] 发布于 2006-03-23 16:50:00
通常当主窗口的过程函数接收到 WM_DESTORY 消息时,会调用 PostQuitMessage 向程序的消息队列插入 WM_QUIT 消息,而当 GetMessage 获取 WM_QUIT 时会返回 0 导致消息循环终止,进而 WinMain 函数返回导致程序终止。
而在你的消息循环之外还套了个死循环,这样即使程序发送 WM_QUIT 消息也不会终止。你的程序能够终止应该是因为到达运行上限而由操作系统强行终止的吧!这样的行为很不好吧~
我之所以问程序是如何退出的是想知道你对这个消息循环的解释,它在何时终止?
9 楼
yjlh1234 [专家分:420] 发布于 2006-03-23 18:27:00
哦
谢谢了
我是在书上看见这样的写法的
而且能够终止(至少在我的机器能顺畅的运行)
就象
main()
{printf("Begin!");
exit(0);
.......//后面有很多东西
}
结果也是只执行了
printf("Begin!");一句
不过我也知道这样做是强行退出 是不好的
小弟以后会改正的
其实很多程序不响应的时候 强行关闭时也是向该程序发送WM_DESTORY 吧
我试过不写处理WM_DESTORY 的方法 结果——》死机
呵呵
10 楼
semker [专家分:4130] 发布于 2006-03-23 20:23:00
哪本书?
我来回复