将CMD的输入输出重定向到自己的进程

简介: void CreateMyPipe(){    //创建管道    CreatePipe(&hReadPipe, &hWritePipe, NULL, NULL);    CreatePipe...
void CreateMyPipe()
{
    //创建管道
    CreatePipe(&hReadPipe, &hWritePipe, NULL, NULL);
    CreatePipe(&hChildReadPipe, &hChildWritePipe, NULL, NULL);


    SetHandleInformation(hWritePipe, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
    SetHandleInformation(hChildReadPipe, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);


    DWORD dwWord = PIPE_NOWAIT;
    SetNamedPipeHandleState(hReadPipe, &dwWord, NULL, NULL);


    //创建CMD进程
    PROCESS_INFORMATION stProcessInfo;
    STARTUPINFO stStartInfo;
    ::ZeroMemory(&stStartInfo,sizeof(stStartInfo));


    stStartInfo.cb = sizeof(stStartInfo);
    stStartInfo.dwFlags = STARTF_USESTDHANDLES;//STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    stStartInfo.hStdError = hWritePipe;
    stStartInfo.hStdOutput = hWritePipe;
    stStartInfo.hStdInput = hChildReadPipe;


    if(!CreateProcessA(NULL, "cmd.exe/0", NULL, NULL, true, DETACHED_PROCESS, NULL, NULL, &stStartInfo, &stProcessInfo))
    {
        MessageBox("启动进程失败!");
        return;
    }else{
        CloseHandle(stProcessInfo.hThread);
        CloseHandle(stProcessInfo.hProcess);
    }


    //从管道中读出数据, 该数据通常为CMD的版本及版权信息
    ReadFromChildPipe();
}


void ReadFromChildPipe()
{
    //读取管道中所有可读取的数据并写入到txtMessage中
    DWORD nRead;
    char* strBuffer = new char[65536];
    long nBufferLen;


    nRead = -1;
    while(nRead != 0)
    {
        nBufferLen = 65536;
        memset(strBuffer, 0, 65536);
        Sleep(30);


        ReadFile(hReadPipe, strBuffer, nBufferLen, &nRead, NULL);
        if(nRead != 0)
        {
            GetDlgItem(IDC_EDIT_MSG)->SetWindowTextA(strBuffer);
        }
    }


    delete[] strBuffer;
}


void WriteMyPipe()
{
    //将命令写入管道
    DWORD nWrite;
    char* strBuffer = new char[300];
    memset(strBuffer, 0, 300);
    memcpy(strBuffer, "dir/r/n", 5);


    if (WriteFile(hChildWritePipe, strBuffer, 5, &nWrite, NULL))
    {
        ReadFromChildPipe();
    }else{
        MessageBox("写入失败");
    }


    delete[] strBuffer;
}


HANDLE hReadPipe;
HANDLE hWritePipe;
HANDLE hChildReadPipe;
HANDLE hChildWritePipe;


CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(hChildReadPipe);
CloseHandle(hChildWritePipe);
目录
相关文章
|
应用服务中间件 nginx
cmd 杀掉 nginx后台进程 命令杀掉nginx后台 nginx 常用命令
cmd 杀掉 nginx后台进程 命令杀掉nginx后台 nginx 常用命令
2898 0
|
Windows
windows cmd 查看占用端口号PID并且结束进程
windows cmd 查看占用端口号PID并且结束进程
|
网络协议 Windows
DOS - Win CMD 杀进程
DOS - Win CMD 杀进程
408 0
DOS - Win CMD 杀进程
|
Windows
Windows 技术篇-cmd强制关闭端口、解除端口占用方法,cmd查询端口相关的进程pid并杀死进程实例演示
Windows 技术篇-cmd强制关闭端口、解除端口占用方法,cmd查询端口相关的进程pid并杀死进程实例演示
3119 0
Windows 技术篇-cmd强制关闭端口、解除端口占用方法,cmd查询端口相关的进程pid并杀死进程实例演示
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。

热门文章

最新文章