【发布时间】:2020-11-22 16:34:24
【问题描述】:
我有一个简单的函数来初始化使用“/SUBSYSTEM:WINDOWS”选项编译的应用程序中的控制台:
bool InitConsole()
{
HANDLE consoleHandleOut, consoleHandleErr;
//we run only in console
if (!AttachConsole(ATTACH_PARENT_PROCESS))
return false;
consoleHandleOut = GetStdHandle(STD_OUTPUT_HANDLE);
consoleHandleErr = GetStdHandle(STD_ERROR_HANDLE);
if ((consoleHandleOut != INVALID_HANDLE_VALUE)
&& (consoleHandleErr != INVALID_HANDLE_VALUE))
{
freopen_s(&fp, "CONOUT$", "w+", stdout);
freopen_s(&fp, "CONOUT$", "w+", stderr);
setvbuf(stderr, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
}
else
return false;
return true;
}
当我在任何本地计算机上使用 PowerShell 或 CMD 运行应用程序时,此功能运行良好。但是,我需要使用远程 PowerShell/Cmd 运行这个应用程序,它已经开始使用这段代码:
STARTUPINFO ini_processo;
PROCESS_INFORMATION processo_info;
memset(&ini_processo, 0, sizeof(ini_processo));
ini_processo.cb = sizeof(ini_processo);
ini_processo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
ini_processo.hStdInput = ini_processo.hStdOutput = ini_processo.hStdError = (HANDLE)ConnectSocket;
ini_processo.wShowWindow = SW_HIDE;
if (CreateProcess(NULL, PSPath, NULL, NULL, TRUE, 0, NULL, NULL, &ini_processo, &processo_info))
{
CloseHandle(processo_info.hThread);
CloseHandle(processo_info.hProcess);
}
我使用 ConnectSocket 句柄来获取所有输出。关闭进程句柄后,程序立即退出以离开带有已连接套接字的 powershell。所以,后来我使用这个 powershell 运行我的应用程序并期望得到一些输出。
它适用于为控制台子系统编译的任何应用程序,也适用于任何命令,如 ls、ps、dir 等。但它不适用于我的程序。函数 InitConsole() 始终返回 TRUE。我可以像总是使用“fprintf(stdout, fmt, ##VA_ARGS)”一样编写控制台,但我根本没有输出。我觉得我写到“另一个”控制台,因为我没有收到错误。
为什么我的程序什么都不显示?
【问题讨论】: