【编程基础】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 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2232
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2727
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2170
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

3038
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4065
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2675
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2626
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2932
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

7188
来自专栏杨龙飞前端

scrollto 到指定位置

2554

扫码关注云+社区