gpt4 book ai didi

c++ - 你如何写入第二个控制台?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:41:55 25 4
gpt4 key购买 nike

我想在我的程序中使用第二个控制台来记录编程事件。我在 msdn 上四处寻找相关的功能/示例,并尝试编写一个简单的程序来执行此操作:

//function in parent that communicates with child
void writeToChild()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

HANDLE inWrite, inRead,
outWrite, outRead;
SECURITY_ATTRIBUTES saAttr;

saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
if (!CreatePipe(&inRead, &inWrite, &saAttr, 0))
{
exit(0xbad);
}
if ( ! SetHandleInformation(inRead, HANDLE_FLAG_INHERIT, 0) )
{
exit(0xbad);
}
if (!CreatePipe(&outRead, &outWrite, &saAttr, 0))
{
exit(0xbad);
}
if ( ! SetHandleInformation(outRead, HANDLE_FLAG_INHERIT, 0) )
{
exit(0xbad);
}

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.lpTitle = "Log";
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = outWrite;
si.hStdError = outWrite;
si.hStdInput = inRead;
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
if( !CreateProcess( NULL,
"Logger",
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi )
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
exit(0xbad);
}
unsigned long numWritten = 0;
WriteFile(inWrite, "Test", 4, &numWritten, NULL);
cout<<"wrote "<<numWritten<<" characters"<<endl;

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}

//Logger
#include <windows.h>

#define BUFSIZE 4096

int main()
{
HANDLE stdin, stdout;
stdin = GetStdHandle(STD_INPUT_HANDLE);
stdout = GetStdHandle(STD_OUTPUT_HANDLE);

char buffer[BUFSIZE];
unsigned long numRead;
while (true)
{
ReadFile(stdin, buffer, BUFSIZE, &numRead, NULL);
if (numRead > 0)
WriteFile(stdout, buffer, numRead, NULL, NULL);
}
return 0;
}

问题是,虽然父控制台显示已写入 4 个字符,但子控制台上没有显示任何内容。我不确定如何调试它,因为我几乎没有 Windows 编程经验。

最佳答案

我不太确定您的代码片段中的单独流程要去哪里。但是,在 Windows 中,您不能有多个控制台与单个进程相关联,尽管您可以有多个屏幕缓冲区与单个控制台相关联并在它们之间切换(请参阅 SetConsoleActiveScreenBuffer 并从那里开始),但您将必须为该切换实现一个用户界面;它不是内置的东西。

如果屏幕缓冲区不适合你,你可以有第二个记录器进程,你可以通过管道或环回套接字或其他一些 IPC 方法与之通信,例如:

  • 您可以使用 syslog ,这是各种应用程序和硬件使用的常见日志记录工具。

  • 您还可以写入日志文件并使用程序查看该文件,例如Windows equivalent of tail -f .这样做的好处是可以将记录的数据存储在一个文件中,以便以后轻松查看。

  • 您可以让您的应用程序充当 TCP 服务器,telnet 到它,并通过 telnet 转储日志消息。

请注意,对于上述任何选项,为了方便您的用户,您可以让您的应用程序单独启动第二个日志监视进程(只需简单调用 ShellExecute,不要太过分)。

其他选项包括:

  • 您可以使用 Windows 事件日志,尽管它可能有点麻烦。

  • 您可以创建一个单独的 GUI 窗口,其中包含用于显示日志消息的文本字段或列表。

  • 如果您的程序是一个 GUI 应用程序,没有有自己的控制台(根据您的描述,情况似乎并非如此,但只是为了完整性)您可以创建AllocConsole单个控制台和 friend (但请注意,在控制台仍处于连接状态时关闭该控制台也会终止您的应用程序)。

这里有很多选择。但是您不能为同一进程使用两个控制台。

关于c++ - 你如何写入第二个控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27113541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com