本来是为了寻找一个程序的错误,在每次调用API出错后把GetLastError()的返回值写到一个文本文件中结果意外地发现每次调用ShowWindow(hwnd,SW_SHOW)后GetLastError()的返回值都为1400
用ErrorLookup查看,1400指无效的窗口句柄。 但是我建立的几个窗口都显示正常于是把几个以前写的程序拿来调试(其中一个是最简单的Win32平台窗口程序,除了建立一个窗口啥都没干)
结果又出现了上述情况从来没遇到过这种奇怪的情况,这难道是GetLastError的BUG?期待高人解答
用ErrorLookup查看,1400指无效的窗口句柄。 但是我建立的几个窗口都显示正常于是把几个以前写的程序拿来调试(其中一个是最简单的Win32平台窗口程序,除了建立一个窗口啥都没干)
结果又出现了上述情况从来没遇到过这种奇怪的情况,这难道是GetLastError的BUG?期待高人解答
不要怀疑系统API,要有这么严重的bug,估计也不要等到今天才发现了。还是看看这个hwnd是不是你显示正常的窗口的句柄吧。hwnd怎么会不是我要显示窗口的句柄,我连这也弄不清吗?
而且如果这都搞错,我的程序怎么会运行正常系统API为什么不能怀疑,而且这样的BUG好像也没什么关系后来我又用VC6建立win32程序的向导建立了一个典型的“Hello World”程序
这我可是一句代码不用写,该不会有错吧,结果在ShowWindow()后GetLastError()还是返回1400有兴趣的人可以试试,看是不是也会出现同样的情况
所以,可能还是你的句柄是无效的吧,检查变量的作用域。
hwnd为无效句柄时,ShowWindow不会报错的。
在这一句设置断点调试,执行这一句后err的值就变成1400了,所以我才会怀疑是API的问题,或者是编译器的问题
MSDN说明该API时,并没有说是否会设置LastError().
所以楼主不必在其后GetLastError(). 倒是可以用IsWindow()来测试是否窗口即可.
而是看GetLastError()的返回值是否非0来判断出错还有,你的意思是不是说在ShowWindow()不会调用SetLastError(),所以在其后调用GetLastError()本就无意义?
估计是其他问题
贴下代码吧
最后参数设为SWP_HIDE
#include<windows.h>
#include<stdio.h>LRESULT CALLBACK MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASS wc;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=MainWndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=CreateSolidBrush(RGB(0,0,0));
wc.lpszMenuName=NULL;
wc.lpszClassName="Window"; if (!RegisterClass(&wc))
{
MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
HANDLE err=CreateFile("err.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,NULL,NULL);
char str[50];
DWORD written; HWND mainwnd; sprintf(str,"新建HWND型变量mainwnd=%x\r\n",mainwnd);
WriteFile(err,str,strlen(str),&written,NULL); mainwnd=CreateWindow("Window","测试",
WS_SYSMENU|WS_MINIMIZEBOX,
0,0,800,600,
NULL,NULL,hInstance,NULL); sprintf(str,"创建窗口后mainwnd=%x,错误代码:%d\r\n",mainwnd,GetLastError());
WriteFile(err,str,strlen(str),&written,NULL);
ShowWindow(mainwnd,SW_SHOW); sprintf(str,"显示窗口错误代码:%d\r\n",GetLastError());
WriteFile(err,str,strlen(str),&written,NULL); UpdateWindow(mainwnd);
sprintf(str,"更新窗口错误代码:%d\r\n",GetLastError());
WriteFile(err,str,strlen(str),&written,NULL); bool run=true; MSG msg;
while(run)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
run=false;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
} CloseHandle(err);
return msg.wParam;
}LRESULT CALLBACK MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
运行之后,工程目录下,err.txt的内容:
新建HWND型变量mainwnd=3b1a50
创建窗口后mainwnd=3d05f0,错误代码:0
显示窗口错误代码:1400
更新窗口错误代码:1400但是窗口显示完全正常
重新建立新的工程也会,
不仅ShowWindow()会返回1400,而UpdateWindow()函数即使成功了也不设置错误代码的,
我做了如下测试: //重置最后错误为0
SetLastError(0)
ShowWindow()
//此时GetLastError() 返回 1400
//重置最后的错误为 100
SetLastError(100)
UpdateWindow()
//此时GetLastError() 返回 100
从上可以看出:MSDN里关于某个函数没有GetLastError说明,调用
GetLastError()应该无意义,不过调用ShowWindow()后
再调用GetLastError()返回1400有点不应该。
如果真是BUG,这样以后用GetLastError()很不放心啊
ShowWindow()的确影响了GetLastError()的返回值,而UpdateWindow()不改变我按照他的方式再测试了一次,跟他的结果一样可是这结论刚好与MSDN相反
MSDN中没说ShowWindow()会响应GetLastError()
同时明确说明UpdateWindow()会响应
以后看MSDN要更仔细了,不过我一看英语就头大看来以后实现是找不出错误了再用GetLastError(),而且要在之前调用SetLastError()