Как просмотреть вывод printf в приложении Win32 на Visual Studio 2010?

Как вы можете просматривать вывод printf в приложении Win32 (ввод с WinMain) в Visual Studio 2010?

Ответы

Ответ 1

Строго отвечая на ваш вопрос, вы можете использовать функции типа printf в приложении Win32 в Visual Studio 2010 с помощью функции winbase.h OutputDebugString.

Я написал простую программу, которая показывает, как это сделать.

#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, "It works! - number: %d \n", number);

    OutputDebugString(str);

    return 0;
}

Функция OutputDebugString принимает параметр LPCSTR в качестве параметра. Я использовал sprintf_s для форматирования строки перед печатью.

Это приведет к выводу результата в окно вывода Visual Studio 2010.

Надеюсь, это поможет!

Ответ 2

Вам понадобится консольное окно. Самый простой способ получить это - изменить вариант компоновщика: Project + Properties, Linker, System, SubSystem = Console. Добавьте метод main():

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

Ответ 3

Я знаю, что в прошлом я делал это с помощью функции AllocConsole, но я также помню, что это было немного сложнее, чем Я ожидал.

Быстрый поиск Google на AllocConsole дает, по-видимому, статью для разработчиков Windows. Оттуда, кажется, похоже на то, что я помню, туманный, как есть.

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);
}

Ответ 4

Спасибо torak за ваш ответ. Это очень помогло мне.

Мне понадобился более большой буфер обратной прокрутки, поэтому я сделал несколько дополнений, посмотрев на функции API. Совместно здесь, если он помогает кому-либо еще:

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.

Ответ 5

Другой способ, который не требует изменения существующего 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");

Ответ 7

Для 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);
  }
}