帮助使用WinAPI包装器

Help with WinAPI wrapper

本文关键字:包装 WinAPI 帮助      更新时间:2023-10-16

我一直在制作一个简单的WinAPI包装器,我遇到了一个相当大的问题。在代码的某个地方,Window类的句柄(HWND)被设置为NULL,并且需要它来处理消息。我已经把代码看了一个小时了,什么也没找到。有人能帮忙吗?

Git存储库

我很确定逻辑错误发生在Declarations…Window.hpp和Declarations…Application.hpp中的某个地方,因为这些是唯一保存正在调用的代码的文件。

让我们从这个开始:

namespace WinAPI{
    #include <windows.h>
    #include <commctrl.h>
}

别那样做。

它可以工作,代价是可能必须为每个新的SDK版本更新代码,但它绝对不是初学者的东西。

下面是如何在c++中包含<windows.h>头文件:

#undef UNICODE
#define UNICODE
#undef STRICT
#define STRICT
#undef NOMINMAX
#define NOMINMAX
#include <windows.h>
#include <windowsx.h>

放在包装头中。

在全局命名空间中包含包装器

哦,你的问题,逻辑错误使你的HWND值消失了吗?你不能指望别人来调试你的代码。

干杯,hth。

如果您还不熟悉assert(),现在可能是学习它的好时机。断言是您认为为真并希望调试器检查的表达式。在您的例子中,您可以查看更新HWND的所有位置,并写入assert(newHWNDvalue != NULL);

断言是注释的一种形式。与//不同,编译器编译它们,调试器检查它们,因此它们不会随着时间的推移而过时。

assert是一个宏,您需要包含<cassert>头。在发布版本中,断言的表达式不会被编译,因此没有开销。这意味着你通常可以支付大额支票。对于复杂的类,添加private: bool CheckInvariants() const方法可能很有用,这样您就可以在其他成员中使用assert(CheckInvariants());