本来是为了寻找一个程序的错误,在每次调用API出错后把GetLastError()的返回值写到一个文本文件中结果意外地发现每次调用ShowWindow(hwnd,SW_SHOW)后GetLastError()的返回值都为1400
用ErrorLookup查看,1400指无效的窗口句柄。 但是我建立的几个窗口都显示正常于是把几个以前写的程序拿来调试(其中一个是最简单的Win32平台窗口程序,除了建立一个窗口啥都没干)
结果又出现了上述情况从来没遇到过这种奇怪的情况,这难道是GetLastError的BUG?期待高人解答

解决方案 »

  1.   

    GetLastError()获取的是最后一次SetLastError的信息。就算是BUG也应该是SHOWWINDOW的BUG,可能是信息反馈搞错了。囧
      

  2.   

    不要怀疑系统API,要有这么严重的bug,估计也不要等到今天才发现了。还是看看这个hwnd是不是你显示正常的窗口的句柄吧。
      

  3.   

    [Quote=引用 2 楼 arong1234 的回复:]
    不要怀疑系统API,要有这么严重的bug,估计也不要等到今天才发现了。还是看看这个hwnd是不是你显示正常的窗口的句柄吧。hwnd怎么会不是我要显示窗口的句柄,我连这也弄不清吗?
    而且如果这都搞错,我的程序怎么会运行正常系统API为什么不能怀疑,而且这样的BUG好像也没什么关系后来我又用VC6建立win32程序的向导建立了一个典型的“Hello World”程序
    这我可是一句代码不用写,该不会有错吧,结果在ShowWindow()后GetLastError()还是返回1400有兴趣的人可以试试,看是不是也会出现同样的情况
      

  4.   

    我试了,如果hwnd有效,GetLastError返回0,我将hwnd=0;然后ShowWindow,返回1400;
    所以,可能还是你的句柄是无效的吧,检查变量的作用域。
    hwnd为无效句柄时,ShowWindow不会报错的。
      

  5.   

    我当然先是怀疑自己代码的问题,于是先找了其他程序,最后我又用VC6建立win32程序的向导建立了一个典型的“Hello World”程序,这个代码就不用贴了吧,点点鼠标就出来了然后我只在ShowWindow(hWnd, nCmdShow);后加了一句DWORD err=GetLastError();
    在这一句设置断点调试,执行这一句后err的值就变成1400了,所以我才会怀疑是API的问题,或者是编译器的问题
      

  6.   

    BOOL ShowWindow(hWnd, nCmdShow)返回值只表示该窗口原状态是否可见,并不表示是否成功.
    MSDN说明该API时,并没有说是否会设置LastError().
    所以楼主不必在其后GetLastError(). 倒是可以用IsWindow()来测试是否窗口即可.
      

  7.   

    我知道ShowWindow返回值的意义,所以我不是通过它的返回值来判断是否出错
    而是看GetLastError()的返回值是否非0来判断出错还有,你的意思是不是说在ShowWindow()不会调用SetLastError(),所以在其后调用GetLastError()本就无意义? 
      

  8.   

    按照lz的意思,用代码测试了,未出现lz所说的问题:
    估计是其他问题
    贴下代码吧
      

  9.   

    你用SetWindowPos试试
    最后参数设为SWP_HIDE
      

  10.   

    刚刚新建一个WIN32空工程,单纯地显示一个背景为黑色的窗口,只有一个源文件main.cpp,代码如下
    #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但是窗口显示完全正常
      

  11.   

    在CreateWindow()里加上了这个风格,结果还是一样.......
      

  12.   

    测试了下,会出现楼主的问题
    重新建立新的工程也会,
    不仅ShowWindow()会返回1400,而UpdateWindow()函数即使成功了也不设置错误代码的,
    我做了如下测试:  //重置最后错误为0
      SetLastError(0)
      ShowWindow()
      //此时GetLastError() 返回 1400
      //重置最后的错误为 100
      SetLastError(100)
      UpdateWindow()
      //此时GetLastError() 返回 100
     
    从上可以看出:MSDN里关于某个函数没有GetLastError说明,调用
    GetLastError()应该无意义,不过调用ShowWindow()后
    再调用GetLastError()返回1400有点不应该。
      

  13.   

    终于出现同样的情况了。。不过还是你考虑的详细貌似ShowWindow()真的有BUG,那其它函数呢?
    如果真是BUG,这样以后用GetLastError()很不放心啊
      

  14.   

    是的,我认为ShowWindow后GetLastError无意义
      

  15.   

    ShowWindow()返回BOOL型,MSDN没说他会被GetLastError()函数响应呀?所以GetLastError()不会从ShowWindow()里得到信息呀!
      

  16.   

    问题是根据20楼的情况,可得出下面的结论
    ShowWindow()的确影响了GetLastError()的返回值,而UpdateWindow()不改变我按照他的方式再测试了一次,跟他的结果一样可是这结论刚好与MSDN相反
    MSDN中没说ShowWindow()会响应GetLastError()
    同时明确说明UpdateWindow()会响应
      

  17.   

    根据GetLastError的MSDN说明,这似乎是正常的The Return Value section of the documentation for each function that sets the last-error code notes the conditions under which the function sets the last-error code. Most functions that set the thread's last-error code set it when they fail. However, some functions also set the last-error code when they succeed. If the function is not documented to set the last-error code, the value returned by this function is simply the most recent last-error code to have been set; some functions set the last-error code to 0 on success and others do not.
      

  18.   

    MSDN只说明如果一个函数声明它会影响last error code,就一定会影响,但是没有说如果函数没有说明是否影响last error code,last error code是不是会受影响。ideally,你的想法是对的,但是似乎微软没有这么做,而且在GetLastError的MSDN说明中,他也明确说他不会这么做
      

  19.   

    感谢各位的帮助GetLastError()没有以前想象中那么有用啊
    以后看MSDN要更仔细了,不过我一看英语就头大看来以后实现是找不出错误了再用GetLastError(),而且要在之前调用SetLastError()