`
xarw24xarw
  • 浏览: 10306 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

给Win32 GUI程序调试信息输出方法

阅读更多

给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();
分享到:
评论

相关推荐

    MFC调用win32窗口显示调试信息

    MFC调用win32窗口显示调试信息,使用AllocConsole 函数(2010-11-16 15:33:25)转载标签: 调试win32mfc杂谈 分类: 编译器 AllocConsole Function 为主调进程分配一个新的控制台。 语法 C++ : BOOL WINAPI ...

    软件加密技术内幕 软件加密技术内幕

    第3章 Win32 调试API 3.1 Win32调试API原理 3.2 利用调试API编写脱壳机 3.3 利用调试API制作内存补丁 第4章 Windows下的异常处理 4.1 基本概念 4.2 结构化异常处理(SEH) 4.3 异常处理程序设计 4.4 SEH的简单应用 ...

    加密解密.技术内幕.chm

    第3章 Win32 调试API3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个...

    软件加密技术内幕 chm

    第3章 Win32 调试API 3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 ...

    软件加密技术内幕

    第3章 Win32 调试API 3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 ...

    【最新版】sloth-2.9.zip【亲测可用】最好的显示系统上所有正在运行的进程正在使用的所有打开的文件和套接字

    Sloth是一个Mac应用程序,它显示系统上所有正在运行的进程正在使用的所有打开的文件和套接字。这使得检查哪些应用程序正在使用哪些文件和套接字变得容易。 特征 查看所有打开的文件,目录,IP套接字,设备,Unix域...

    eclipse 开发c/c++

    虽然该项目的重点是 Linux,但它在可使用 GNU 开发者工具的所有环境(包括 Win32(Win 95/98/Me/NT/2000/XP)、QNX Neutrino 和 Solaris 平台)中都能工作。 CDT 是完全用 Java 实现的开放源码项目(根据 Common ...

    PT80-NEAT开发指南v1.1

    使用 NEAT 工程向导建立应用程序 ........................................................................................................ 5 编译及运行程序(模拟器下) ......................................

    【软件加密技术内幕】

    <br/>第3章 Win32 调试API <br/>3.1 Win32调试API原理 <br/> 3.1.1 调试相关函数简要说明 <br/> 3.1.2 调试事件 <br/> 3.1.3 如何在调试时创建并跟踪一个进程 <br/> 3.1.4 最主要的循环体...

    Delphi7.完美经典

    12-2 Win32选项卡中的常用组件 12-2-1 TPageControl组件 12-2-2 TImageList组件 12-2-3 TRichEdit组件 12-2-4 TDateTimePicker组件 12-2-5 TStatusBar组件 12-3 System选项卡中的常用组件 12-3-1 TTimer组件 ...

    软件病毒特征码定位软件multiCCL

    Lcc_win32 MASM32 v9.0 Radasm ollydbg 1.10 winHex 12.5 包含文档: 1. multiCCL_f.exe 文件特征码专用版 2. multiCCL_m.exe 内存特征码专用版 3. multiCCL_inj.exe 注入代码块内存定位专用版 4. memtest....

    multiCCL_f

    Lcc_win32 MASM32 v9.0 Radasm ollydbg 1.10 winHex 12.5 包含文档: 1. multiCCL_f.exe 文件特征码专用版 2. multiCCL_m.exe 内存特征码专用版 3. multiCCL_inj.exe 注入代码块内存定位专用版 4. memtest....

    (完整word版)python3基础教程.doc

    Python 基础教程 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl语言一样, Python 源代码同样遵循 GPL(GNU ...

    Delphi7.完美经典.part1

    <br>12-1 Additional选项卡中的常用组件 12-1-1 TBitBtn组件 12-1-2 TMaskEdit组件 12-1-3 TImage组件 12-1-4 TShape组件 12-2 Win32选项卡中的常用组件 12-2-1 TPageControl组件 ...

    java程序是怎么操作数据库的,可以以常用据库为例,求详细解答,最好能举例。

    最后需要说的是笔者的调试上面程序的环境:WIN2000 , JDK1.3,MS SQLSERVER编辑软件:EDITPLUS 2.01a(这最后的东西可不是废话,虽然早就了一些专业的JAVA开发工具,但是笔者建议JAVA初学者使用文本软件开发JAVA程序...

Global site tag (gtag.js) - Google Analytics