Как просмотреть вывод 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");
Ответ 6
Вот страница, которая расскажет вам, как это сделать, включая пример кода.
Вы должны создать консольное окно с помощью AllocConsole(), а затем связать стандартные дескрипторы файла с инструментами HANDLE нового окна консоли.
Ответ 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);
}
}