(更新)OutputDebugString函数简单封装,实现格式化打印输出(VC++)

时间:2022-01-07 21:52:48
MyOutputDebugString是对OutputDebugString的简单封装。
微软对OutputDebugString的说明文档地址:https://msdn.microsoft.com/en-us/library/aa363362(VS.85).aspx
其中我们主要关心这些:
OutputDebugString function

Sends a string to the debugger for display.

Important  In the past, the operating system did not output Unicode strings via OutputDebugStringW and instead only output ASCII strings. To force OutputDebugStringW to correctly output Unicode strings, debuggers are required to callWaitForDebugEventEx to opt into the new behavior. On calling WaitForDebugEventEx, the operating system will know that the debugger supports Unicode and is specifically opting into receiving Unicode strings.

void WINAPI OutputDebugString(  _In_opt_ LPCTSTR lpOutputString);
Parameters lpOutputString  [in, optional]

The null-terminated string to be displayed.

Return value

This function does not return a value.


英文差的朋友,可以多用词典(我推荐灵格斯)。

简单概括一下函数作用:输出调试字符串,主要用于调试输出。

但是该函数使用起来不是很方便,因为他没有类似sprintf格式化输出的功能,也因此有了本文,下面的封装可以让它实现sprintf的功能。

//MyOutputDebugString.h 
#ifndef MY_OUTPUTDEBUGSTRING_H
#define MY_OUTPUTDEBUGSTRING_H
#define MYPRINT

#include <string>

//使用示例:MyOutputDebugStringA("%d,%s",123,"hello");
void MyOutputDebugStringA(const char * lpcszOutputString, ...);

//使用示例:MyOutputDebugStringW(L"%d,%s",456,L"world!");
void MyOutputDebugStringW(const wchar_t * szOutputString,...);

#endif
</string>
//MyOutputDebugString.cpp#include <windows.h>#include <stdlib.h>#include <stdarg.h>#include <vector>using namespace std;#define MYPRINTvoid MyOutputDebugStringA(const char * lpcszOutputString, ...){#ifdef MYPRINTstring strResult;if (NULL != lpcszOutputString){va_list marker = NULL;va_start(marker, lpcszOutputString); //初始化变量参数size_t nLength = _vscprintf(lpcszOutputString, marker) + 1; //获取格式化字符串长度std::vector<char> vBuffer(nLength, '\0'); //创建用于存储格式化字符串的字符数组int nWritten = _vsnprintf_s(&vBuffer[0], vBuffer.size(), nLength, lpcszOutputString, marker);if (nWritten>0){strResult = &vBuffer[0];}va_end(marker); //重置变量参数}if (!strResult.empty()){string strFormated = "[sunflover] ";strFormated.append(strResult);OutputDebugStringA(strFormated.c_str());}#endif}void MyOutputDebugStringW(const wchar_t * lpcwszOutputString, ...){#ifdef MYPRINTwstring strResult;if (NULL != lpcwszOutputString){va_list marker = NULL;va_start(marker, lpcwszOutputString); //初始化变量参数size_t nLength = _vscwprintf(lpcwszOutputString, marker) + 1; //获取格式化字符串长度std::vector<wchar_t> vBuffer(nLength, '\0'); //创建用于存储格式化字符串的字符数组int nWritten = _vsnwprintf_s(&vBuffer[0], vBuffer.size(), nLength, lpcwszOutputString, marker);if (nWritten>0){strResult = &vBuffer[0];}va_end(marker); //重置变量参数}if (!strResult.empty()){wstring strFormated = L"[sunflover] ";strFormated.append(strResult);OutputDebugStringW(strFormated.c_str());}#endif}</wchar_t></char></vector></stdarg></stdlib></windows>

以上是.h和.cpp文件源代码,我们只需要在使用时包含这两个文件就可以使用MyOutputDebugStringA/W函数。

使用实例:

新建控制台项目,项目名称MyPrintf,然后将MyOutputDebugString.h和MyOutputDebugString.cpp添加到工程,就可以调用了,调用代码如下

// MyPrintf.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include "MyOutputDebugString.h"//需要将.h,.cpp文件添加到项目中。

int _tmain(int argc, _TCHAR* argv[])
{
MyOutputDebugStringW(L"%d %d %s", 20, 100, L"www.jmpoep.com");//格式化输出调试日志;
getchar();//作用:等待,防止直接退出;
return 0;
}
编译之后,我们打开DebugView,然后Ctrl+F5(直接运行程序,不调试),效果如下图,如果调试运行,那么调试输出信息将被显示在调试的输出窗口,DebugView无法再次捕获。

(更新)OutputDebugString函数简单封装,实现格式化打印输出(VC++)

选中行为我们打印出的调试信息,不过是不是感觉很乱,有很多信息,我们添加一个关键字过滤即可:(这儿关键字在MyOutputDebugString.cpp 中,大家可以根据需要来更改)
(更新)OutputDebugString函数简单封装,实现格式化打印输出(VC++)
我们清一下屏,然后再次不调试运行程序,发现只有一条我们需要关注的信息了。
(更新)OutputDebugString函数简单封装,实现格式化打印输出(VC++)

是不是感觉非常好用呢,那么下次就添加到自己的项目中去吧!