【问题标题】:Windows application can't write to remote consoleWindows 应用程序无法写入远程控制台
【发布时间】: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)”一样编写控制台,但我根本没有输出。我觉得我写到“另一个”控制台,因为我没有收到错误。

为什么我的程序什么都不显示?

【问题讨论】:

    标签: c++ winapi console


    【解决方案1】:

    我可以像往常一样使用“fprintf(stdout, fmt, ##VA_ARGS)”,但我根本没有输出。我觉得我写到“另一个”控制台,因为我没有收到错误。

    当您启动 cmd.exe 时,您会立即退出您的应用程序,这会关闭套接字。您需要在 cmd.exe 进程的整个生命周期内保持套接字打开。

    修改:

    CloseHandle(processo_info.hThread);
    WaitForSingleObject(processo_info.hProcess, INFINITE);
    CloseHandle(processo_info.hProcess);
    

    【讨论】:

    • 这是不对的。套接字已复制到运行 cmd 的应用程序。请看一下 CreateProcess 参数。我写道,除了我的程序之外,一切都运行良好。
    • @David 也许你可以参考:stackoverflow.com/a/58278889/11128312
    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2015-05-22
    • 2011-12-12
    相关资源
    最近更新 更多