给Win32 GUI程序调试信息输出方法
2011年09月23日
DebugView可以追踪TRACE(实际上是Windows函数OutputDebugString)的一个工具.
======================================================================
在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用MessageBox弹出对话框、OutputDebugString向VS的调试窗口输出信息等,但总感觉不如控制台输出几句printf有效率。经过尝试发现GUI程序照样能够拥有(且仅能够拥有一个)控制台窗口,具体做法如下:
#include
在程序初始化时,加入以下代码:
FILE* fpDebugOut = NULL;
FILE* fpDebugIn = NULL;
if( !AllocConsole() ) MessageBox(NULL, _T("控制台生成失败。"), NULL, 0);
SetConsoleTitle(_T("Debug Window"));
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout);
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin);
_tsetlocale(LC_ALL, _T("chs")); //这是必要的,否则unicode模式下使用C库函数控制台输出不了中文 WriteConsole函数不受影响
注意AllocConsole可能失败,原因可能是程序已经于一个控制台窗口关联过了,等等。
程序结束时,加入以下代码:
fclose(fpDebugOut);
fclose(fpDebugIn);
FreeConsole();
好,现在已经加入了控制台,可以输出字符串了,使用标准的C库函数或者WriteConsole都可以:
使用WriteConsole的话前面其实不用调用freopen重定向输出流了,直接WriteConsole就行:
TCHAR str[256];
DWORD numOfCharWritten = 0;
_stprintf_s(str, 256, _T("今年是 %d 年\n"), 2008);
WriteConsole( GetStdHandle(STD_OUTPUT_HANDLE), str, _tcslen(str), &numOfCharWritten, NULL);
使用C库函数则更简单,但上面一定要调用freopen才有效:
int tmp = 0;
_tscanf_s(_T("%d\n"), &tmp);
_tprintf_s(_T("刚才输入的是 %d\n"), tmp);
比如在响应WM_PAINT消息时,加入_tprintf_s(_T("重绘 %d 次\n"), ++count),则每次窗口绘制的时候都将输出总重绘次数。
最后,定义两个宏图省事:
#define CREATE_DEBUG_CONSOLE \
FILE* fpDebugOut = NULL; \
FILE* fpDebugIn = NULL; \
FILE* fpDebugErr = NULL; \
if( !AllocConsole() ) \
MessageBox(NULL, _T("控制台生成失败。"), NULL, 0); \
SetConsoleTitle(_T("Debug Window")); \
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout); \
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin); \
_tfreopen_s(&fpDebugErr, _T("CONOUT$"),_T("w"), stderr); \
_tsetlocale(LC_ALL, _T("chs"));
#define RELEASE_DEBUG_CONSOLE \
fclose(fpDebugOut); \
fclose(fpDebugIn); \
fclose(fpDebugErr); \
FreeConsole();
发表评论
-
Sharepoint+MOSS分册第2轮筛选结果文章列表
2012-01-20 00:34 730Sharepoint+MOSS分册第2轮筛 ... -
在 Android 平台上应用 Berkeley DB 11gR2 SQL(drop-in模式)(转http://www.cnmsdn.com/html/201004/1270362092ID3134.html)
2012-01-20 00:34 787在 Android 平台上应用 Ber ... -
编程心得
2012-01-20 00:34 680编程心得 2011年03月21日 转自:http://w ... -
在 C# 中通过 P/Invoke 调用Win32 DLL
2012-01-20 00:34 765在 C# 中通过 P/Invoke 调用Win32 DLL ... -
http://www.cnblogs.com/yungboy/archive/2010/05/28/1746376.html
2012-01-20 00:33 866http://www.cnblogs.com/yungboy/ ... -
10] 建立C帝国(GDAL编译安装以及一般的C库编译步骤)
2012-01-19 01:31 88810] 建立C帝国(GDAL编译安 ... -
Android开发之Android体系架构介绍
2012-01-19 01:31 1565Android开发之Android体系 ... -
EGLIBC库介绍
2012-01-19 01:31 602EGLIBC库介绍 2011年05月05 ... -
SAMSUNG S3C2440的简易BootLoader ㈢
2012-01-19 01:31 607SAMSUNG S3C2440的简易BootLoa ... -
Application/Session/Cookie/viewstate/Cache/隐藏域/查询字符串的比较
2012-01-17 00:48 649Application/Session/Cookie/view ... -
v4l2驱动编写篇(2)
2012-01-17 00:48 1187v4l2驱动编写篇(2) 2011年04月01日 应用可 ... -
file_operation结构体详解
2012-01-17 00:48 1011file_operation结构体详解 2011年06月22 ... -
电脑蓝屏自动关机故障的检修方法
2012-01-17 00:48 656电脑蓝屏自动关机故障的检修方法 2011年09月23日 ... -
Video4Linux
2012-01-17 00:48 777Video4Linux 2011年12月05日 Vide ... -
HK-2000数据采集仪WEB服务器BOA的移植方法
2012-01-15 19:37 686HK-2000数据采集仪WEB服务器BOA的移植方法 200 ... -
如何为linux嵌入式开发建立交叉编译环境(2.4内核)
2012-01-15 19:36 698如何为linux嵌入式开发建立交叉编译环境(2.4内核) 2 ... -
【转】如何为嵌入式开发建立交叉编译环境
2012-01-15 19:36 754【转】如何为嵌入式开发建立交叉编译环境 2009年10月26 ... -
EGLIBC库介绍
2012-01-15 19:36 550EGLIBC库介绍 2011年05月05 ... -
c库函数qsort使用方法实例
2012-01-15 19:36 548c库函数qsort使用方法实例 2010年01月03日 ...
相关推荐
- Win32程序:可以是控制台程序或GUI程序,后者使用窗口、按钮、菜单等图形元素与用户交互。 3. **创建基于控制台的Win32程序** 创建这样的程序,首先需要设置项目配置,确保选择“控制台应用程序”模板。然后,...
【SeggerEval_WIN32_MSVC_GUI_V636.zip】是一个包含Segger公司emWin图形用户界面(GUI)的仿真工程,适用于Windows 32位环境,并且使用Microsoft Visual Studio(MSVC)进行编译。这个压缩包是版本6.36的更新,为...
本文将深入探讨如何在Win32程序中使用console窗口,以便在开发过程中方便地查看和记录调试信息。 首先,创建一个Win32程序时,默认情况下,如果它是一个控制台应用程序(比如基于C或C++的程序),Windows会自动为它...
1. **Win32 API**:Win32 API是Windows操作系统的核心组件,提供了一系列函数和结构,用于创建图形用户界面(GUI)、处理窗口事件、输入输出、内存管理等。在这个程序中,开发者可能使用了`CreateWindow`、`...
《SeggerEval_WIN32_MSVC_MinGW_GUI_V548——探索嵌入式图形界面的新高度》 SeggerEval_WIN32_MSVC_MinGW_GUI_V548是一款专为开发者设计的最新版Segger emWin PC模拟器,版本号为V548。这个强大的工具集成了emWin...
【华中科技大学汇编实验win32窗口程序框架】是一个针对初学者和进阶者设计的教学资源,旨在帮助学习者理解和掌握使用汇编语言编写Windows操作系统下的图形用户界面(GUI)程序。在这个实验中,你将接触到Win32 API,...
本文档主要介绍了如何使用Win32 API中的`AllocConsole`函数在MFC程序中创建并利用控制台窗口来显示调试信息,以及相关的API使用方法。 #### 二、`AllocConsole`函数详解 `AllocConsole`函数用于为当前进程分配一个...
9. **调试工具**:包括调试信息的获取和调试过程的控制,如OutputDebugString函数可以将字符串输出到调试器。 "Win32 API大全.chm"这个文件是一个帮助文件,通常包含了详细的API函数介绍、参数说明、返回值以及示例...
Win32 API不仅包括了图形用户界面(GUI)的元素,如窗口、按钮、菜单等,还包括了系统管理、进程与线程控制、内存管理、文件操作、网络通信等多个方面的功能。 1. **系统调用与函数库**:Win32 API是一个庞大的函数...
Win32画图程序是Windows操作系统中的一个基础图形用户界面(GUI)应用程序,它允许用户进行简单的图像编辑和绘制操作。在这个压缩包中,我们看到了“实验五.sln”、“实验五.v11.suo”以及“实验五”和“Debug”等...
【SeggerEval_WIN32_MSVC_MinGW_GUI_V542.zip】是一个包含Segger公司开发的emWin图形用户界面库v5.42版本的压缩包,主要用于Windows 32位平台,并且集成了Microsoft Visual C++ (MSVC) 和 MinGW编译环境的支持。...
Win32应用程序是基于Windows API构建的,它们通常包含消息循环、窗口过程函数以及各种窗口消息的处理。在本项目中,开发者会创建一个主窗口,通过`CreateWindow`或`CreateWindowEx`函数注册窗口类并初始化窗口。 2...
SeggerEval_WIN32_MSVC_MinGW_GUI_V544.zip是一个包含Segger公司emWin图形用户界面库的5.44版本的压缩包。emWin是一个广泛用于微控制器(MCU)应用的嵌入式GUI库,它提供了丰富的图形功能,支持多种硬件平台和编译...
控制台应用程序意味着它没有图形用户界面(GUI),而是通过文本输入和输出进行交互。 C#是一种面向对象的编程语言,由微软公司开发并广泛应用于Windows平台。它具有丰富的类库和强大的类型系统,支持泛型、匿名方法...
这个压缩包包含了一系列帮助文件和资源,如索引(WIN32.CNT)、快速搜索文件(win32.FTS)、标识文件(win32.GID)、主帮助文件(WIN32.HLP)、关键词文件(WIN32.KWF)以及来源信息文件(www.pudn.com.txt)。...
Visual Studio 2012是一个强大的集成开发环境(IDE),它提供了编写、调试和部署Win32程序所需的所有工具。安装完毕后,你需要创建一个新的Win32 Console Application项目,并选择“空项目”模板,因为我们要从头...
Win32 API 包含了大量的函数、结构、常量和消息,用于创建图形用户界面(GUI)、处理窗口、输入输出、内存管理、网络通信等多个方面。它支持C和C++语言,使得程序员可以直接调用系统级别的函数,实现高效、低级的...
10. **调试和性能优化**:Win32 API提供了一些工具和函数,帮助开发者调试程序,如调试器接口、性能计数器等。了解这些工具能提高开发效率并提升程序性能。 总之,《Microsoft Win32 程序员参考大全》是一本全面...
`SetLastError`和`GetLastError`用于记录和查询最近的错误代码,`OutputDebugString`则方便在调试过程中输出信息。 综上所述,《微软Win32编程指南》涵盖了Windows平台开发的方方面面,从基础的窗口和消息处理到...
【标题】"零基础学VC_基于控制台的Win32程序" 涵盖了初学者如何从零开始学习Microsoft Visual C++(简称VC)编程,并专注于创建基于控制台的Win32应用程序。这个主题旨在让没有编程背景的人能够理解和掌握C++编程...