【编程基础】Win32窗口下调试输出

在Win32的console下,我们可以用基本的printf,来输出调试信息,这个很方便。不过要是在非console的窗口模式应用程序里面,就不能使用printf来输出,很多朋友遇到过这个问题,非常不方面。

其实在窗口模式下,windows提供了一个函数OutputDebugString,用于向开发环境的debug窗口输出信息,结合C语言的可变参数,就能实现跟printf一样的功能了,下面就是一个简单的采用OutputDebugString封装的调试输出函数,用法跟printf一样:

#include <windows.h> #include <stdarg.h> void OutputDbgInfo(const TCHAR *format, ...) { TCHAR szData[512] = {0}; va_list arg;

va_start(arg, format); _vsntprintf(szData, sizeof(szData)-1, format, arg); va_end(arg);

OutputDebugString(szData); }

另外,在编写windows应用程序时,不管是console还是窗口程序,都会经常使用GetLastError函数获取出错信息,但是这个获取到的仅仅是一个错误号,需要查询MSDN才能得知是什么意思?这样相当不方便。

既然问题抛出来了,读者大概猜到有解决方案了?没错,我们可以通过FormatMessage函数,将错误号转化为相应的错误描述,这个函数对于寻找错误原因非常有用。在console下,用这个函数格式化后直接用printf输出,在窗口程序下结合上面的OutputDebugString函数,也能方面的知道错误描述了,完整的函数如下:

#include <windows.h> #include <strsafe.h> void PrintError(DWORD dwErrcode) { LPVOID lpMsgBuf; LPVOID lpDisplayBuf;

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );

lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf)+40)*sizeof(TCHAR)); StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf), TEXT("err code: %d, %s"), dwErrcode, lpMsgBuf); OutputDebugString((LPCWSTR)lpDisplayBuf);

LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf); }

如果你是在Windows平台下编写程序,以上部分就可以直接使用了,非常简单方便。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-07-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏你不就像风一样

从一个例子入门Mysql储存过程

854
来自专栏Android小菜鸡

Android自定义View——手写签批

  接到一个领导批示保留原笔迹的功能,类似于绘画板,用户打开后可以绘制,点击完成后以图片的形式保存在本地,并且显示绘制后图片,上传服务器,达到保留原笔迹的目的。...

693
来自专栏曾大稳的博客

ffmpeg android 推送RTMP

https://blog.csdn.net/leixiaohua1020/article/details/39803457

705
来自专栏小樱的经验随笔

BugkuCTF SQL注入1

1424
来自专栏IT笔记

Linux如何查看当前占用CPU或内存最多的几个进程

命令 ps -aux | sort -k4nr | head -N 命令详解: head:-N可以指定显示的行数,默认显示10行。 ps:参数a指代all——所...

3266
来自专栏阮一峰的网络日志

asm.js 和 Emscripten 入门教程

Web 技术突飞猛进,但是有一个领域一直无法突破 ---- 游戏。 游戏的性能要求非常高,一些大型游戏连 PC 跑起来都很吃力,更不要提在浏览器的沙盒模型里跑了...

2675
来自专栏玄魂工作室

PHP代码审计Day1 - in_array函数缺陷

--------------------------------------------------------------------------------...

551
来自专栏信安之路

CTF 玩转 pwn 月度总结

自从加入 RTIS 交流群, 在 7o8v 师傅, gd 大佬 的帮助下, PWN 学习之路进入加速度. 下面是 8 周学习的总结, 基本上是按照how2hea...

830
来自专栏安恒网络空间安全讲武堂

逆向专题 | Writeup分享一

逆向WP分享一 0x01.re4 首先我们先点开运行试玩一下,大意就是让你输入正确的用户名和密码就能拿到flag,接下来进入正题。 ? 丢进IDA中,先shi...

2199
来自专栏猿人谷

使用鼠标

C语言Windows程序设计 -> 第十一天 -> 使用鼠标 鼠标的使用同样是通过获取Windows鼠标消息来获取用户当前的鼠标状态的。 一、鼠标的介绍 ...

17110

扫描关注云+社区