【问题标题】:Help with WinAPI wrapperWinAPI 包装器的帮助
【发布时间】:2011-09-05 07:19:15
【问题描述】:

我一直在制作一个简单的 WinAPI 包装器,但遇到了一个很大的问题。在代码中的某处,Window 类的句柄 (HWND) 设置为 NULL,并且它是处理消息所必需的。我一直在查看代码一个小时,但我找不到任何东西。有人可以帮忙吗?

Git repository

我很确定逻辑错误发生在 Declarations...\Window.hpp 和 Declarations...\Application.hpp 中的某处,因为这些文件是唯一包含被调用代码的文件。

【问题讨论】:

  • 太大了,你应该学会使用调试器。大多数调试器都有监视功能,请使用它。
  • +1 决定编写一个 GUI 工具包作为学习 C++ 的练习。就是那种精神! :-)
  • 设置数据断点(或在调试器中调用的任何内容)并安排调试器在写入 NULL 的位置中断。
  • @Frerich Raabe,我已经用 C++ 编程两年多了......我真的很讨厌使用 WinAPI 编程,而且我有时间,所以我开始这样做.
  • @PiMaster:关于“为什么每个人都假设 [你] 在学习 C++”,那是因为你所说的和展示的一切都在大声呼喊你不仅在学习 C++,而且还在学习编程。尝试从 C# 或 Java 等不太复杂的语言开始可能是个好主意。

标签: c++ winapi user-interface wrapper


【解决方案1】:

让我们从这个开始:

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

不要那样做。

它可以工作,但可能需要为每个新的 SDK 版本更新代码,但它绝对不适合初学者。

以下是在 C++ 中包含 &lt;windows.h&gt; 标头的方法:

#undef UNICODE
#define UNICODE
#undef STRICT
#define STRICT
#undef NOMINMAX
#define NOMINMAX

#include <windows.h>
#include <windowsx.h>

将其放在包装标题中。

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

哦,你的问题是,导致你的 HWND 值消失的逻辑错误?你不能指望别人调试你的代码。

干杯,

【讨论】:

  • 这真的对我一点帮助都没有......库按原样编译,所以在它真正成为问题之前我不会担心它。特别是考虑到我可以使用 Code::Blocks 简单地将“WinAPI::”替换为“”。
【解决方案2】:

如果您还不熟悉assert(),这可能是了解它的好时机。断言是您认为正确的表达式,并且您希望调试器对其进行检查。在您的情况下,您可以查看所有更新HWND 的地方,并写assert(newHWNDvalue != NULL);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多