Windows客户端开发--使用控制台窗口显示调试信息(打log)

时间:2022-02-11 20:44:15

从我们写第一行c++代码开始,应该大部分人使用的是win32控制台应用程序吧。

后来,我们有了一定的C++知识,要进行具有图形界面的开发,也就是有窗口。这样,我们使用了win32应用程序。

关于win32控制台和win32应用程序的区别,你可以看看这里:
Hey,别搞错了Win32项目和Win32控制台程序

如果今天讨论的就是,如何在win32项目中,使用控制台窗口显示一些调试信息。

基础知识

==AllocConsole==
allocate a new console for the calling process

功能:为调用进程分配一个新的控制台。
原型:

BOOL WINAPI AllocConsole(void);

返回:
如果成功,返回非零
如果失败,返回零

注意:
A process can be associated with only one console, so the AllocConsole function fails if the calling process already has a console. A process can use the FreeConsole function to detach itself from its current console, then it can call AllocConsole to create a new console or AttachConsole to attach to another console.
一个进程智能使用一个控制台,可以使用FreeConsole函数结束当前的控制台,然后通过AllocConsole创建一个新的控制台,并使用AttachConsole函数把当前进程关联到新的控制台上。

==freopen_s==
associate a new filename with the given open stream and at the same time cloess the old file in the stream

功能:指定模式重新指定到另一个文件
原型:

errno_t freopen( 
FILE** pFile,
const char *path,
const char *mode,
FILE *stream
);

参数:
pFile
A pointer to the file pointer to be provided by the call.

path
Path of new file.

mode
Type of access permitted.

stream
Pointer to FILE structure.

例子:

#include <stdio.h>
#include <stdlib.h>

FILE *stream;

int main( void )
{
errno_t err;
// Reassign "stderr" to "freopen.out":
err = freopen_s( &stream, "freopen.out", "w", stderr );

if( err != 0 )
fprintf( stdout, "error on freopen\n" );
else
{
fprintf( stdout, "successfully reassigned\n" ); fflush( stdout );
fprintf( stream, "This will go to the file 'freopen.out'\n" );
fclose( stream );
}
system( "type freopen.out" );
}

==wprintf_s==
wprintf_s 是 printf_s 的宽字符版本

原型:

int wprintf_s(
const wchar_t *format [,
argument]...
);

使用

这里需要注意的是:
“CONOUT$”是指当前console的特殊字符串。

#ifdef _DEBUG
AllocConsole();
FILE* fp = NULL;
freopen_s(&fp, "CONOUT$", "w+t", stdout);
wprintf_s(L"Command:\n%s\n\n", lpszCmdLine);
#endif