如何打印在一个Win32应用程序调试输出窗口?(How do I print to the debu

2019-06-21 03:22发布

我有,我已经加载到Visual Studio 2005中,我想能够打印的东西到Visual Studio输出窗口win32的项目,但我不能为我的生活工作如何。 我已经试过“的printf”和“COUT <<”,但我的邮件会固执地未打印。

是否有某种特殊的方式来打印到Visual Studio输出窗口?

Answer 1:

您可以使用OutputDebugStringOutputDebugString是取决于你的编译选项或者映射到宏OutputDebugStringA(char const*)OutputDebugStringW(wchar_t const*) 在后一种情况下,你将不得不宽字符的字符串提供给函数。 要创建一个宽字符文字可以使用L的前缀:

OutputDebugStringW(L"My output string.");

通常情况下,你将与一起使用宏版本_T宏是这样的:

OutputDebugString(_T("My output string."));

如果您的项目配置为构建UNICODE将扩展为:

OutputDebugStringW(L"My output string.");

如果不建设UNICODE将扩展为:

OutputDebugStringA("My output string.");


Answer 2:

如果该项目是一个GUI项目,没有控制台就会出现。 为了改变项目到控制台一个你需要去项目属性面板,并设置:

  • 在“ 接头- >系统- >子系统 ”值“ 控制台(/ SUBSYSTEM:CONSOLE)”
  • “C / C ++ - > Preprocessor->预处理定义 ”添加“_CONSOLE”定义

只有当你有经典的“INT主要()”切入点此解决方案。

但是,如果你像我的情况(OpenGL的项目),你并不需要编辑的属性,因为这工作得更好:

AllocConsole();
freopen("CONIN$", "r",stdin);
freopen("CONOUT$", "w",stdout);
freopen("CONOUT$", "w",stderr);

printf和COUT将照常上班。

如果你创建一个窗口之前调用AllocConsole,控制台将出现在窗口后面,如果你以后调用它,它会出现提前。



Answer 3:

打印到real控制台,你需要使它可见通过使用链接标志/SUBSYSTEM:CONSOLE 。 额外的控制台窗口很烦人,但对调试的目的是非常有价值的。

OutputDebugString调试器中运行时打印到调试器输出。



Answer 4:

考虑使用VC ++运行宏用于报告_RPT N()和_RPTF N()

您可以使用_RPTn和_RPTFn宏,在CRTDBG.H定义,以取代用于调试的printf语句。 这些宏在发布版本自动消失,没有定义_DEBUG的时候,所以没有必要将它们封闭在的#ifdefs。

例...

if (someVar > MAX_SOMEVAR) {
    _RPTF2(_CRT_WARN, "In NameOfThisFunc( )," 
         " someVar= %d, otherVar= %d\n", someVar, otherVar );
}

或者你可以使用VC ++运行时函数_CrtDbgReport,_CrtDbgReportW直接。

_CrtDbgReport和_CrtDbgReportW可以发送调试报告,以三种不同的目的地:一个调试报告文件,调试监控器(Visual Studio调试器),或调试消息窗口。

_CrtDbgReport和_CrtDbgReportW由参数[n]的参数代入格式字符串,使用由printf或者wprintf功能而定义的相同的规则创建的调试报告的用户消息。 这些函数然后生成调试报告,并确定一个或多个目的地的基础上,为REPORTTYPE定义的当前报告模式和文件。 当报告发送到调试消息窗口,文件名,行号,和模块名被包括在所述窗口中显示的信息。



Answer 5:

你的Win32项目可能是一个GUI的项目,而不是一个控制台项目。 这会导致在可执行文件头的差。 其结果是,你的GUI项目将负责打开自己的窗口。 这可能是一个控制台窗口,虽然。 调用AllocConsole()来创建它,并使用Win32控制台功能来写它。



Answer 6:

如果你想打印十进制变量:

wchar_t text_buffer[20] = { 0 }; //temporary buffer
swprintf(text_buffer, _countof(text_buffer), L"%d", your.variable); // convert
OutputDebugString(text_buffer); // print


Answer 7:

如果需要看到广泛使用的printf的w / o改变代码的现有程序的输出(或最小的变化),则可以如下重新定义printf和它添加到共用首部(stdafx.h中)。

int print_log(const char* format, ...)
{
    static char s_printf_buf[1024];
    va_list args;
    va_start(args, format);
    _vsnprintf(s_printf_buf, sizeof(s_printf_buf), format, args);
    va_end(args);
    OutputDebugStringA(s_printf_buf);
    return 0;
}

#define printf(format, ...) \
        print_log(format, __VA_ARGS__)


Answer 8:

我一直在寻找一种方法来此做自己,想出了一个简单的解决方案。

我假设你开始了一个默认的Win32项目(Windows应用程序)在Visual Studio中,它提供了一个“WinMain函数”功能。 默认情况下,Visual Studio中设置的入口点“子系统:WINDOWS”。 您需要通过将首先改变这一点:

项目 - >属性 - >链接器 - >系统 - >子系统

从下拉列表中:选择“控制台(CONSOLE /子系统)”。

现在,该程序将无法运行,因为需要,而不是“WinMain函数”功能的“主”的功能。

所以现在你可以添加一个“主”的功能就像你通常会在C ++中。 在此之后,启动GUI程序,你可以从“主”函数中调用“的WinMain”功能。

你的程序的起始部分现在应该是这个样子:

#include <iostream>

using namespace std;

// Main function for the console
int main(){

    // Calling the wWinMain function to start the GUI program
    // Parameters:
    // GetModuleHandle(NULL) - To get a handle to the current instance
    // NULL - Previous instance is not needed
    // NULL - Command line parameters are not needed
    // 1 - To show the window normally
    wWinMain(GetModuleHandle(NULL), NULL,NULL, 1); 

    system("pause");
    return 0;
}

// Function for entry into GUI program
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    // This will display "Hello World" in the console as soon as the GUI begins.
    cout << "Hello World" << endl;
.
.
.

我执行的结果

现在,您可以在调试或其他目的的GUI程序的任何部分使用功能输出到控制台。



Answer 9:

您还可以使用WriteConsole方法打印在控制台上。

AllocConsole();
LPSTR lpBuff = "Hello Win32 API";
DWORD dwSize = 0;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), lpBuff, lstrlen(lpBuff), &dwSize, NULL);


文章来源: How do I print to the debug output window in a Win32 app?