CreatePipe() 関数を使用して C++ でコンソールを操作する方法

CreatePipe 関数を使用してパイプを作成し、コンソール入出力に接続できます。以下は、CreatePipe 関数を使用してコンソールを操作するサンプルコードです。

#include <Windows.h>
#include <iostream>

int main() {
    HANDLE hReadPipe, hWritePipe;
    SECURITY_ATTRIBUTES sa;
    PROCESS_INFORMATION pi;
    STARTUPINFO si;

    // 创建管道
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;

    if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) {
        std::cout << "Failed to create pipe" << std::endl;
        return 1;
    }

    // 将标准输出重定向到管道写入端
    GetStartupInfo(&si);
    si.dwFlags = STARTF_USESTDHANDLES;
    si.hStdOutput = hWritePipe;

    // 创建子进程并执行命令
    if (!CreateProcess(NULL, "ping 127.0.0.1", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
        std::cout << "Failed to create process" << std::endl;
        return 1;
    }

    // 从管道读取子进程的输出
    const int bufferSize = 4096;
    char buffer[bufferSize];
    DWORD bytesRead;
    while (ReadFile(hReadPipe, buffer, bufferSize - 1, &bytesRead, NULL) && bytesRead != 0) {
        buffer[bytesRead] = '\0';
        std::cout << buffer;
    }

    // 等待子进程退出
    WaitForSingleObject(pi.hProcess, INFINITE);

    // 关闭句柄
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe);

    return 0;
}

先のコードはパイプを作成し、子プロセスの標準出力をパイプの書き込み先にリダイレクトしています。その後、パイプの読み込み先から子プロセスの出力を取得してコンソールに出力しています。最後に、子プロセスが終了するのを待って、関連のハンドルを閉じます。ping 127.0.0.1 を実行したいコマンドに置き換えてください。

bannerAds