CreateWindow返回空句柄而GetLastError返回0咋回事

2019-08-30 11:38:24 浏览数 (1)

调用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,但是程序没崩溃。

0 人点赞