C语言 如何在Visual Studio 2010上查看Win32应用程序中的printf输出?

6ie5vjzr  于 2023-03-12  发布在  其他
关注(0)|答案(8)|浏览(392)

如何在Visual Studio 2010中查看Win32应用程序(使用WinMain进入)中的printf输出?

yqlxgs2m

yqlxgs2m1#

编辑2021,Visual Studio 2019

要将调试消息写入“输出”窗口,请使用debugapi.h中的OutputDebugStringA(包括windows. h)

测试c

#include <windows.h>
#include <stdio.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdShow, int nCmdShow)
{
    int number = 10;
    char str[256];
    sprintf_s(str, sizeof(str), "It works! - number: %d \n", number);

    OutputDebugStringA(str);

    return 0;
}

在Visual Studio 2019上进行了测试,调试/ x64。
或者使用我的header文件。

pgpifvop

pgpifvop2#

你需要一个控制台窗口,到目前为止,最简单的方法就是修改链接器选项:项目+属性,链接器,系统,子系统=控制台。添加main()方法:

int main() {
    return _tWinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW);
}
ftf50wuq

ftf50wuq3#

我知道我过去使用AllocConsole函数做过这件事,但我也记得这比我预期的要棘手一些。
在AllocConsole上进行快速的Google搜索,得到了一个似乎相关的Windows Developer Journal article。从那里,下面的内容似乎与我回忆的内容相似,尽管它很模糊。

void SetStdOutToNewConsole()
{
    int hConHandle;
    long lStdHandle;
    FILE *fp;

    // Allocate a console for this app
    AllocConsole();

    // Redirect unbuffered STDOUT to the console
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen(hConHandle, "w");
    *stdout = *fp;

    setvbuf(stdout, NULL, _IONBF, 0);
}
ddhy6vgd

ddhy6vgd4#

另一种不需要改变现有printf的方法是打印到VS输出窗口,如下所示:

#define printf printf2

int __cdecl printf2(const char *format, ...)
{
    char str[1024];

    va_list argptr;
    va_start(argptr, format);
    int ret = vsnprintf(str, sizeof(str), format, argptr);
    va_end(argptr);

    OutputDebugStringA(str);

    return ret;
}

...

printf("remains %s", "the same");
lqfhib0f

lqfhib0f5#

谢谢你的回答,这对我帮助很大。
我需要一个更大的回滚缓冲区,所以在看了API functions之后做了一些补充。在这里分享,以防它对其他人有帮助:

void SetStdOutToNewConsole()
{
    // allocate a console for this app
    AllocConsole();

    // redirect unbuffered STDOUT to the console
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _O_TEXT);
    FILE *fp = _fdopen( fileDescriptor, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );

    // give the console window a nicer title
    SetConsoleTitle(L"Debug Output");

    // give the console window a bigger buffer size
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if ( GetConsoleScreenBufferInfo(consoleHandle, &csbi) )
    {
        COORD bufferSize;
        bufferSize.X = csbi.dwSize.X;
        bufferSize.Y = 9999;
        SetConsoleScreenBufferSize(consoleHandle, bufferSize);
    }
}

这会将回滚(屏幕缓冲区)高度增加到9999行。
在Windows XP和Windows 7上进行了测试。

p1iqtdky

p1iqtdky6#

Here is a page that will tell you how to do this, including sample code.
必须使用AllocConsole()创建控制台窗口,然后将C标准文件句柄与新控制台窗口的HANDLE关联。

cygmwpex

cygmwpex7#

对于MinGW,使用“_A_SYSTEM”代替“_O_TEXT”。因此移植的Quintin Willison答案如下:

#include <io.h>
void SetStdOutToNewConsole()
{
  // allocate a console for this app
  AllocConsole();
  // redirect unbuffered STDOUT to the console
  HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _A_SYSTEM);
  FILE *fp = _fdopen( fileDescriptor, "w" );
  *stdout = *fp;
  setvbuf( stdout, NULL, _IONBF, 0 );
  // give the console window a nicer title
  SetConsoleTitle(L"Debug Output");
  // give the console window a bigger buffer size
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  if ( GetConsoleScreenBufferInfo(consoleHandle, &csbi) )
  {
    COORD bufferSize;
    bufferSize.X = csbi.dwSize.X;
    bufferSize.Y = 9999;
    SetConsoleScreenBufferSize(consoleHandle, bufferSize);
  }
}
ct3nt3jp

ct3nt3jp8#

下面是一个工作代码

FILE* fpFile;
AllocConsole(); // or AttachConsole(ATTACH_PARENT_PROCESS); // if parent has one
freopen_s(&fpFile,"CONOUT$", "w", stdout); // redirect stdout to console
freopen_s(&fpFile,"CONOUT$", "w", stderr); // redirect stderr to console
freopen_s(&fpFile,"CONIN$", "r", stdin); // redirect stdin to console

相关问题