我有一个使用win32应用程序开发的exe。当我运行(双击)时,应该会出现exe图形,并且当我通过命令提示符输出exe时,应该会出现在命令控制台中。Win32应用程序使用printf将输出写入控制台
我的问题是我如何使用printf
将输出重定向到命令窗口?我可以使用AllocConsole()
在命令窗口中打印,但是会创建新的命令窗口并将输出重定向到新窗口。我想在使用Win32应用程序调用exe的相同命令窗口中打印输出。任何帮助赞赏。
我有一个使用win32应用程序开发的exe。当我运行(双击)时,应该会出现exe图形,并且当我通过命令提示符输出exe时,应该会出现在命令控制台中。Win32应用程序使用printf将输出写入控制台
我的问题是我如何使用printf
将输出重定向到命令窗口?我可以使用AllocConsole()
在命令窗口中打印,但是会创建新的命令窗口并将输出重定向到新窗口。我想在使用Win32应用程序调用exe的相同命令窗口中打印输出。任何帮助赞赏。
尝试使用AttachConsole(ATTACH_PARENT_PROCESS)
(或使用PID)连接到现有控制台。
虽然我已经发布了我的答案,TBH,我不确定我是否完全理解您的问题。我有一个评论,说(如上AllocConsole()
一些代码:。
在这里,我们忽略了返回值,如果我们已经有一个控制台,它会失败
你肯定你不能只需使用AllocConsole()
无条件地像我这样做?
AllocConsole仅在您想要创建新控制台时才有用。 OP想要使用现有的控制台(如果有的话)或根本没有控制台(如果没有)。 –
我尝试使用AttachConsole(ATTACH_PARENT_PROCESS),它将打开新的cmd窗口。我的问题陈述是我打开一个cmd窗口,并去我的exe文件存在的位置(C:\ test.exe),然后从相同的cmd窗口运行exe文件。 On包括AttachConsole()输出显示在新的cmd窗口中。 – user1881297
@ user1881297:好吧,那不应该发生。 AttachConsole()不应该创建一个新的控制台!你能给我们[一个MCVE](http://stackoverflow.com/help/mcve)吗? –
要建立在什么wilx说(对不起,我没有足够的声誉,只是他的回答评论),可以使用AttachConsole(...);因此要附加到一个控制台如果仅当有已经有一个你可以使用类似于:
bool bAttachToConsole()
{
if (!AttachConsole(ATTACH_PARENT_PROCESS))
{
if (GetLastError() != ERROR_ACCESS_DENIED) //already has a console
{
if (!AttachConsole(GetCurrentProcessId()))
{
DWORD dwLastError = GetLastError();
if (dwLastError != ERROR_ACCESS_DENIED) //already has a console
{
return false;
}
}
}
}
return true;
}
然后在你的WinMain函数,你可以这样做:
if (bAttachToConsole())
{
//do your io with STDIN/STDOUT
// ....
}
else
{
//Create your window and do IO via your window
// ....
}
此外,你将不得不“修正” C标准IO处理,以使用新的控制台中看到以下write up的一个很好的例子这个怎么做。
问题是命令行界面不知道等待您的程序退出,因此您的输出将与命令行提示混合在一起。如果您需要输入,问题会更加严重。 –
好点的哈利。从控制台应用程序开始,并通过参数隐藏控制台可能是唯一的方法来获得一个exe的关闭。 – Dustin
这个尝试:
// Win32Project1.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <stdio.h> // printf
#include <io.h> // _open_osfhandle, _dup2
void SetupConsole()
{
BOOL bCreated = AllocConsole();
if (!bCreated)
return; // We already have a console.
HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
int fd = _open_osfhandle((intptr_t)hConOut, 0);
_dup2(fd, 1);
}
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
SetupConsole();
printf("Hello world!");
Sleep(10000);
return 0;
}
AllocConsole仅在您想要创建新控制台时才有用。 OP想要使用现有的控制台(如果有的话)或根本没有控制台(如果没有)。 –
我尝试使用AttachConsole(ATTACH_PARENT_PROCESS),它将打开新的cmd窗口。我的问题陈述是我打开一个cmd窗口,并去我的exe文件存在的位置(C:\ test.exe),然后从相同的cmd窗口运行exe文件。 On包括AttachConsole()输出显示在新的cmd窗口中。 – user1881297
这几乎做你想做的:
// Win32Project1.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <stdio.h> // printf, _dup2
#include <io.h> // _open_osfhandle
void SetupConsole()
{
AttachConsole(ATTACH_PARENT_PROCESS);
HANDLE hConIn = GetStdHandle(STD_INPUT_HANDLE);
int fd0 = _open_osfhandle((intptr_t)hConIn, 0);
_dup2(fd0, 0);
HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
int fd1 = _open_osfhandle((intptr_t)hConOut, 0);
_dup2(fd1, 1);
HANDLE hConErr = GetStdHandle(STD_ERROR_HANDLE);
int fd2 = _open_osfhandle((intptr_t)hConErr, 0);
_dup2(fd2, 2);
}
WNDPROC g_pOldProc;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_CLOSE)
{
PostQuitMessage(0);
return 0;
}
return CallWindowProc(g_pOldProc, hwnd, uMsg, wParam, lParam);
}
void GUI(HINSTANCE hInstance)
{
HWND hWnd = CreateWindow(
_T("EDIT"),
_T("GUI"),
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
100, 100, 200,200,
NULL,
NULL,
hInstance,
NULL
);
g_pOldProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)&WindowProc);
SetWindowText(hWnd, _T("Hello world."));
MSG m;
while (GetMessage(&m, NULL, 0, 0))
{
DispatchMessage(&m);
}
DestroyWindow(hWnd);
}
void Console()
{
SetupConsole();
printf("Hello world.");
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (!hConOut)
GUI(hInstance);
else
Console();
return 0;
}
[AttachConsole](https://msdn.microsoft.com/en-us/library/windows/desktop /ms681952.aspx)。 – IInspectable
您是否问过如何从命令提示符运行时像命令行程序一样运行,并在双击时使用GUI运行? – crashmstr
不完全重复,但非常密切相关http://stackoverflow.com/questions/24171017/win32-console-application-that-can-open-windows/29687965#29687965 –