我有,我已经加载到Visual Studio 2005中,我想能够打印的东西到Visual Studio输出窗口win32的项目,但我不能为我的生活工作如何。 我已经试过“的printf”和“COUT <<”,但我的邮件会固执地未打印。
是否有某种特殊的方式来打印到Visual Studio输出窗口?
我有,我已经加载到Visual Studio 2005中,我想能够打印的东西到Visual Studio输出窗口win32的项目,但我不能为我的生活工作如何。 我已经试过“的printf”和“COUT <<”,但我的邮件会固执地未打印。
是否有某种特殊的方式来打印到Visual Studio输出窗口?
您可以使用OutputDebugString
。 OutputDebugString
是取决于你的编译选项或者映射到宏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.");
如果该项目是一个GUI项目,没有控制台就会出现。 为了改变项目到控制台一个你需要去项目属性面板,并设置:
只有当你有经典的“INT主要()”切入点此解决方案。
但是,如果你像我的情况(OpenGL的项目),你并不需要编辑的属性,因为这工作得更好:
AllocConsole();
freopen("CONIN$", "r",stdin);
freopen("CONOUT$", "w",stdout);
freopen("CONOUT$", "w",stderr);
printf和COUT将照常上班。
如果你创建一个窗口之前调用AllocConsole,控制台将出现在窗口后面,如果你以后调用它,它会出现提前。
打印到real
控制台,你需要使它可见通过使用链接标志/SUBSYSTEM:CONSOLE
。 额外的控制台窗口很烦人,但对调试的目的是非常有价值的。
OutputDebugString
调试器中运行时打印到调试器输出。
考虑使用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定义的当前报告模式和文件。 当报告发送到调试消息窗口,文件名,行号,和模块名被包括在所述窗口中显示的信息。
你的Win32项目可能是一个GUI的项目,而不是一个控制台项目。 这会导致在可执行文件头的差。 其结果是,你的GUI项目将负责打开自己的窗口。 这可能是一个控制台窗口,虽然。 调用AllocConsole()
来创建它,并使用Win32控制台功能来写它。
如果你想打印十进制变量:
wchar_t text_buffer[20] = { 0 }; //temporary buffer
swprintf(text_buffer, _countof(text_buffer), L"%d", your.variable); // convert
OutputDebugString(text_buffer); // print
如果需要看到广泛使用的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__)
我一直在寻找一种方法来此做自己,想出了一个简单的解决方案。
我假设你开始了一个默认的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程序的任何部分使用功能输出到控制台。
您还可以使用WriteConsole方法打印在控制台上。
AllocConsole();
LPSTR lpBuff = "Hello Win32 API";
DWORD dwSize = 0;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), lpBuff, lstrlen(lpBuff), &dwSize, NULL);