OutputDebugStringAPI函數(shù)包括MultiChar和Unicode兩種版本:OutputDebugStringA和OutputDebugStringW,原型:如下:
void
__stdcall
OutputDebugStringA(
const char*lpOutputString
);
void
__stdcall
OutputDebugStringW(
const wchar_tlpOutputString
);
使用起來非常簡單,只有一個參數(shù)而--且沒有返回值.
DebugWindow的實現(xiàn):
由2個事件,1個系統(tǒng)緩沖區(qū)的映射指針來實現(xiàn).
1個事件用來得到對系統(tǒng)緩沖區(qū)的訪問權(quán),另一個用來通過對系統(tǒng)緩沖區(qū)操作完畢.
緩沖區(qū)的聲明為:
#pragma pack(push)
#pragma pack(1)
typedef struct __DEBUGBUFFER
{
DWORD sz;
char szString[4096 - sizeof(DWORD)];//這里保存了OutputDebugString輸出的字符串
} DEBUGBUFFER, *PDEBUGBUFFER;
#pragma pack(pop)
請求訪問緩沖區(qū)的事件名為:"DBWIN_BUFFER_READY"
通知緩沖區(qū)有新數(shù)據(jù)的事件名為:"DBWIN_DATA_READY"
系統(tǒng)緩沖區(qū)對象名為:"DBWIN_BUFFER"
實例代碼:
// DebugOutCapture.cpp : 定義控制臺應用程序的入口點。
//
#include "stdafx.h"
#pragma pack(push)
#pragma pack(1)
typedef struct __DEBUGBUFFER
{
DWORD sz;
char szString[4096 - sizeof(DWORD)];
} DEBUGBUFFER, *PDEBUGBUFFER;
#pragma pack(pop)
;
#define MAX_DEBUG_BUF_LEN (4096)
#define _Try __try
#define _Finally __finally
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE m_hReadyEvent;
DWORD m_dwResult;
HANDLE hMapping = NULL;
HANDLE hAckEvent = NULL;
PDEBUGBUFFER pdbBuffer = NULL;
//TCHAR tzBuffer[MAX_DEBUG_BUF_LEN];
_Try
{
#define _LeaveIf(expr) if(expr == TRUE) /
returnFALSE;
// 設(shè)置初始結(jié)果
m_dwResult =ERROR_INVALID_HANDLE;
// 打開事件句柄
hAckEvent = CreateEvent(NULL,FALSE, FALSE, TEXT("DBWIN_BUFFER_READY"));
_LeaveIf(hAckEvent ==NULL);
m_hReadyEvent =CreateEvent(NULL, FALSE, FALSE, TEXT("DBWIN_DATA_READY"));
_LeaveIf(m_hReadyEvent ==NULL);
// 創(chuàng)建文件映射
hMapping =CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0,MAX_DEBUG_BUF_LEN, TEXT("DBWIN_BUFFER"));
_LeaveIf(hMapping ==NULL);
// 映射調(diào)試緩沖區(qū)
pdbBuffer = (PDEBUGBUFFER)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
_LeaveIf(pdbBuffer ==NULL);
// 循環(huán)
for (m_dwResult =ERROR_SIGNAL_PENDING; (m_dwResult == ERROR_SIGNAL_PENDING); )
{
//等待緩沖區(qū)數(shù)據(jù)
SetEvent(hAckEvent);
if(WaitForSingleObject(m_hReadyEvent, INFINITE) ==WAIT_OBJECT_0)
{
//如果是繼續(xù)等待,否則表示主線程發(fā)出了停止信號,退出當前線程
if(m_dwResult == ERROR_SIGNAL_PENDING)
{
//添加新項
printf(pdbBuffer->szString);
}
}
else
{
//等待失敗
m_dwResult= WAIT_ABANDONED;
}
}
}
_Finally
{
#define _SafeCloseHandle(handle) if(handle != NULL) /
CloseHandle(handle);
// 釋放
if (pdbBuffer)
{
UnmapViewOfFile(pdbBuffer);
}
_SafeCloseHandle(hMapping);
_SafeCloseHandle(m_hReadyEvent);
_SafeCloseHandle(hAckEvent);
// 返回結(jié)果
return m_dwResult;
}
}
一個非常典型的應用就是在VisualStudio之中IDE的輸出子窗體,它其實就是一個Debug信息接收窗體,只需在源碼中為OutputDebugString函數(shù)輸入需要輸出的調(diào)試信息就可以了,例子:
CString strDebugOutput;
strDebugOutput.Format("This is debug infor/n");
OutputDebugString(strDebugOutput.GetBuffer());
運行就可以看到在輸出窗體中的Debug信息輸出.
實例和測試工程請從這里下載:
http://download.csdn.net/source/940777
愛華網(wǎng)



