如何从其他控制台程序获取输出

问题描述 投票:0回答:1

我正在开发一个程序,它可以抓取发送到另一个程序控制台的所有内容。我无法访问该程序源,我只需要获取其输出。

我不知道如何在 Windows 上用 C++ 执行此操作。

c++ windows console
1个回答
0
投票

Рыба,в которую тебе только вставить путь к дочерней програме(взято с learn microsoft)。 Будет работать в том случае, если дочерняя программа не запросит повышения прав (права админа)。 buf будет храниться вывод в массиве char, в str виде std::string。 Суть - создание двух 管道输入和输出 из другого приложения, передача их в StartUpInfo от CreateProcess() в "si.dwFlags" обзательно должно стоять значение “STARTF_USESTDHANDLES”,例如 hStdError/hStdOutput/hStdInput,взятые с 管道,проигнорируются。

#include <iostream>
#include <windows.h>
#include <stdio.h>

int main()
{
    BOOL ok = TRUE;
    HANDLE hStdInPipeRead = NULL;
    HANDLE hStdInPipeWrite = NULL;
    HANDLE hStdOutPipeRead = NULL;
    HANDLE hStdOutPipeWrite = NULL;

    // Create two pipes.
    SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
    ok = CreatePipe(&hStdInPipeRead, &hStdInPipeWrite, &sa, 0);
    if (ok == FALSE) return -1;
    ok = CreatePipe(&hStdOutPipeRead, &hStdOutPipeWrite, &sa, 0);
    if (ok == FALSE) return -1;

    // Create the process.
    STARTUPINFO si = { };
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESTDHANDLES;
    si.hStdError = hStdOutPipeWrite;
    si.hStdOutput = hStdOutPipeWrite;
    si.hStdInput = hStdInPipeRead;
    PROCESS_INFORMATION pi = { };
    LPCWSTR lpApplicationName = TEXT("[path to your dauther program]");
    LPWSTR lpCommandLine = NULL;
    LPSECURITY_ATTRIBUTES lpProcessAttributes = NULL;
    LPSECURITY_ATTRIBUTES lpThreadAttribute = NULL;
    BOOL bInheritHandles = TRUE;
    DWORD dwCreationFlags = 0;
    LPVOID lpEnvironment = NULL;
    LPCWSTR lpCurrentDirectory = NULL;
    ok = CreateProcess(
        lpApplicationName,
        lpCommandLine,
        lpProcessAttributes,
        lpThreadAttribute,
        bInheritHandles,
        dwCreationFlags,
        lpEnvironment,
        lpCurrentDirectory,
        &si,
        &pi);

    // Close pipes we do not need.
    CloseHandle(hStdOutPipeWrite);
    CloseHandle(hStdInPipeRead);

    // The main loop for reading output from the DIR command.
    char buf[1024 + 1] = { };
    DWORD dwRead = 0;
    DWORD dwAvail = 0;
    ok = ReadFile(hStdOutPipeRead, buf, 1024, &dwRead, NULL);
    while (ok == TRUE)
    {
        buf[dwRead] = '\0';
        OutputDebugStringA(buf);
        puts(buf);
        ok = ReadFile(hStdOutPipeRead, buf, 1024, &dwRead, NULL);
    }

    // Clean up and exit.
    CloseHandle(hStdOutPipeRead);
    CloseHandle(hStdInPipeWrite);

    DWORD dwExitCode = 0;
    GetExitCodeProcess(pi.hProcess, &dwExitCode);
    std::string str(buf);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    return dwExitCode;
}
© www.soinside.com 2019 - 2024. All rights reserved.