【问题标题】:OutputDebugString an int in win32 [duplicate]在win32中的OutputDebugString一个int [重复]
【发布时间】:2020-12-28 14:52:46
【问题描述】:

我是 win32 api 的新手,作为我学习的一部分,我想打印出我的鼠标坐标 (LOWORD(lParam), HIWORD(lParam))。我怎么做? OutputDebugString 仅获取 LPCWSTR 值,所以我需要将 int 转换为该值吗?或者有更好的方法吗?

【问题讨论】:

  • Windows with C++ - Using Printf with Modern C++。要点:您的问题与OutputDebugStringW 无关。
  • 问题是我在SUBSYSTEM:WINDOWS下看不到printf,那怎么查看printf呢?
  • 您可以将 SUBSYSTEM:CONSOLE 与 GUI 应用程序一起使用。我经常在调试模式下为我的 Qt 应用程序执行此操作,但在发布时将其禁用。说到这里,你可能需要我们 int main() 而不是 WinMain,我不记得我在 2 年里没有直接做过 winapi。
  • 听起来您不仅是 Windows API 的新手,而且还是 C(和 C++)的新手。因此我的评论。您使用vsprintf 系列函数将printf 放入内存缓冲区。
  • @rem 这完全不是理智的 C++ 方式。理智的(-ish)C++ 方式是std::format

标签: c++ debugging winapi


【解决方案1】:

OutputDebugString 只知道如何向调试器发送文本字符串。

OutputDebugString("This works because this is a string.\n");
int x = GetMouseXCoordinate();
OutputDebugString(x);  // This doesn't work because x isn't a string.

如果您想打印还不是文本字符串的内容,您首先必须使用文本表示创建一个字符串,然后将其发送到OutputDebugString

int x = GetMouseXCoordinate();
// Here's a method commonly used in C and C++ to format the value yourself.
char message[63];
sprintf(message, "%d", x);
OutputDebugString(message);

还有其他选择(例如使用itoastd::stringstreamsprintf 的更安全版本等)如果您想向调试器的输出窗口发送大量消息,这可能会很麻烦。您问题的 cmets 中链接的许多帖子都是使用预处理器宏、C++ 函数重载或模板隔离格式化步骤的方法。所有这些解决方案都有取舍。

我个人的解决方案是从std::basic_streambuf 派生我自己的流缓冲区类型,并覆盖它的几个虚拟方法以将输出定向到附加的调试器。然后我创建一个名为dbg 的输出流实例,它使用我的字符串缓冲区。所以,当我想输出到调试窗口时,我只是使用 C++ 格式的输出:

dbg << "Mouse coordinates: " << x << ", " << y << std::endl;

在发布版本中,dbg 是一个什么都不做的虚拟类,优化器足够聪明,不会费心生成任何格式和输出代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多