我有服务器进程,它的分配控制台和重定向输出和输入到该控制台。使用ShellExecute,此服务器进程会生成一些客户端,这些客户端知道服务器ProcessID。所以,我尝试使用下一课的AttachConsole:
Console::Console(DWORD dwProcessId)
{
if (dwProcessId) {
AttachConsole(dwProcessId);
}
else
AllocConsole();
CONSOLE_SCREEN_BUFFER_INFO coninfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
coninfo.dwSize.Y = 500;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
int hConHandle;
long lStdHandle;
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
FILE *fp = _fdopen( hConHandle, "w" );
*stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 );
std::ios::sync_with_stdio();
}
Console::~Console()
{
FreeConsole();
}
但它不起作用,甚至从服务器进程擦除输出到控制台。嗯..可能只有一个进程可以输出到控制台。是否可以从多个进程向控制台发送输出?
答案 0 :(得分:1)
您应该使用CONOUT$
打开CreateFile
。附加到控制台不会更改进程继承的星标句柄。
答案 1 :(得分:0)
有人可以告诉我为什么接下来的更改会让我的代码运行良好:
Console::Console(DWORD dwProcessId)
{
if (dwProcessId) {
AttachConsole(dwProcessId);
HANDLE consoleHandle = CreateFileA("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if (consoleHandle == INVALID_HANDLE_VALUE)
throw 1;
if (!SetStdHandle(STD_OUTPUT_HANDLE, consoleHandle))
throw 2;
}
else {
AllocConsole();
CONSOLE_SCREEN_BUFFER_INFO coninfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
coninfo.dwSize.Y = 500;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
}
int hConHandle;
long lStdHandle;
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
FILE *fp = _fdopen( hConHandle, "w" );
*stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 );
}
现在使用ShellExecute创建的客户端可以写入服务器控制台。