Win32 应用程序使用 printf 将输出写入控制台

use*_*297 3 c++ windows winapi

我有一个使用 win32 应用程序开发的 exe。当我运行(双击)exe GUI 应该出现,当我从命令提示符输出调用 exe 时应该出现在命令控制台中。

我的问题是如何使用 将输出重定向到命令窗口printf?我可以使用在命令窗口中打印AllocConsole(),但会创建新的命令窗口并将输出重定向到新窗口。我想在使用 Win32 应用程序调用 exe 的同一命令窗口中打印输出。任何帮助表示赞赏。

小智 5

要建立在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;
}
Run Code Online (Sandbox Code Playgroud)

然后在您的 WinMain 中,您可以执行以下操作:

if (bAttachToConsole())
{
    //do your io with STDIN/STDOUT
    // ....
}
else
{
    //Create your window and do IO via your window
    // ....
}
Run Code Online (Sandbox Code Playgroud)

此外,你将不得不“修复” C标准IO手柄使用新的控制台中看到下面写了关于如何做一个很好的例子。

  • 问题是命令行界面不知道等待您的程序退出,因此您的输出将与命令行提示符混合。如果您需要输入,问题会更糟。 (2认同)