调用CreateWindow或CreateWindowEx创建窗口返回空句柄时,我们总是会调用GetLastError看下错误码,就知道具体错误的原因(比如窗口类未注册),但如果GetLastError返回0没有报错,是怎么回事呢?
阅读CreateWindow API说明文档,梳理下CreateWindow的主要内部实现过程:
第一,系统创建窗口资源,获得一个窗口句柄。
第二,SendMessage发送WM_CREATE消息,消息处理函数WndProc处理WM_CREATE消息,返回处理结果
第三,如果处理结果为0,窗口创建成功返回窗口句柄,如果处理结果非0,销毁窗口,返回空句柄。
所以,CreateWindow返回空句柄而GetLastError返回0是因为未正确处理WM_CREATE消息,返回非0值。
笔者自己遇到过两例未正确处理WM_CREATE消息:
第一,窗口处理函数没有处理WM_CREATE消息时,没有调用默认窗口处理函数 retrunDefWindowProc(…);
第二,窗口处理函数入口处写了一段代码,该段代码触发了ASSERT,也就是DebugBreak,但是程序没崩溃。