专栏首页程序员互动联盟【编程基础】Win32窗口下调试输出

【编程基础】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),作者:John

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【今日问题】变量未初始化引起的崩溃

    昨天写的今日问题,有小伙伴给我反馈,觉得挺有用,小编今天继续给小伙伴们总结遇到的常见问题 一、初学者经常由于没有养成良好的编程习惯,未初始化变量会引起那些问题 ...

    程序员互动联盟
  • 【专业技术】在C/C++程序中打印当前函数调用栈

    前几天帮同事跟踪的一个程序莫名退出,没有core dump(当然ulimit是打开的)的问题。我们知道,正常情况下,如果程序因为某种异常条件退出的话,应该会产生...

    程序员互动联盟
  • 【编程基础第十二讲】web开发编程基础--回调函数

    存在问题: 我们都知道C语言存在回调函数,那么JavaScript中的回调函数是如何实现的? 如何实施: a.非参数回调函数 这类回调函数大多比较简单,往往传一...

    程序员互动联盟
  • 机器学习数学笔记|大数定理中心极限定理矩估计

    课程传送门: http://www.julyedu.com/video/play/38

    DrawSky
  • 浅谈javascript中的回调函数javascript中的函数匿名函数回调函数回调函数的使用回调函数实例总结

    要理解javascript中的回调函数,首先我们就要对javascript中的函数有一定的理解,所以我们先从javascript中函数谈起,讲讲它与其他语言中的...

    desperate633
  • 【Python环境】Python函数式编程指南(2):函数

    2. 从函数开始 2.1. 定义一个函数 如下定义了一个求和函数: def add(x, y): return x + y 关于参数和返回值的语法细节可以参考...

    陆勤_数据人网
  • 类与对象2

    (注意:这里的赋值是在替换方法,并不是调用函数,所以【不要加上括号】—— 写成类.原始函数() = 新函数()是错误的。)

    py3study
  • 函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数.md

    For example, in Lisp the 'square' function can be expressed as a lambda expressi...

    一个会写诗的程序员
  • SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易

    目录 CLR 用户定义函数 模式匹配 数据提取 模式存储 匹配 在匹配项中进行数据提取 总结 尽管 T-SQL 对多数数据处理而言极其强大,...

    菩提树下的杨过
  • Google C++编程风格指南(二)之函数的相关规范

    定义:内联函数是指用inline关键字修饰的函数。在类内定义的函数被默认成内联函数。

    Dabelv

扫码关注云+社区

领取腾讯云代金券