【问题标题】:cmd.exe created with CreateProcess() doesn't read from WriteFile()使用 CreateProcess() 创建的 cmd.exe 不会从 WriteFile() 读取
【发布时间】:2021-12-13 19:08:01
【问题描述】:

我用 CreateProcess() 创建了一个子进程。 cmd.exe 的一个实例。第一个命令在创建进程时传递,第二个命令在创建进程后通过 WriteFile() 传递。第一项工作完成了,第二项没有完成,我不知道原因。请帮忙

创建进程的代码为:

PROCESS_INFORMATION _info;
char cmd[1024];
strcpy(cmd,"C:\\Windows\\system32\\cmd.exe /k echo 1");

    HANDLE _stdin_rd = NULL;
    HANDLE _stdin_wr = NULL;
    HANDLE _stdout_rd = NULL;
    HANDLE _stdout_wr = NULL;
    BOOL br;
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;
    br = CreatePipe(&_stdin_rd, &_stdin_wr, &sa, 0);
    br = SetHandleInformation(_stdin_wr, HANDLE_FLAG_INHERIT, 0);
    br = CreatePipe(&_stdout_rd, &_stdout_wr, &sa, 0);
    br = SetHandleInformation(_stdout_rd, HANDLE_FLAG_INHERIT, 0);
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(STARTUPINFO));
    ZeroMemory(&_info, sizeof(PROCESS_INFORMATION));
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags |= STARTF_USESTDHANDLES;
    si.hStdInput = _stdin_rd;
    si.hStdOutput = _stdout_wr;
    si.hStdError = _stdout_wr;
    br = CreateProcess(0, cmd,0,0,TRUE,CREATE_NO_WINDOW,0,0,&si,&_info);
    CloseHandle(_stdout_wr);
    CloseHandle(_stdin_rd);
    CloseHandle(_info.hProcess);
    CloseHandle(_info.hThread);
    printf("process created...\n");

    Sleep(320);
    printf("waited\n\n");

与进程通信的代码是:

    char bufy[10240];
    char kom[1024];
    long unsigned int prt, ovs=0;
    for(int i=2;i<10;++i){
        if(!ReadFile(_stdout_rd,bufy+ovs,10240-ovs,&prt,0)){
            printf("   ERROR=%d\n",GetLastError());
            break;
        }
        ovs+=prt;
        printf("respond: ");
        bufy[ovs]=0;
        printf("%s\n",bufy);

        sprintf(kom,"/k echo %d",i);
        BOOL odgw = WriteFile(_stdin_wr,kom,strlen(kom),0,0);
        printf("sent(%s): %s\n",odgw?"TRUE":"FALSE",kom);
    }

return 0;

我得到的程序输出是:

process created...
waited

respond: 1

D:\>
sent(TRUE): /k echo 2

【问题讨论】:

  • 你不做任何错误检查。开始为此添加代码。
  • 如果你的代码被编译,那么这不是C++。
  • @Jabberwocky 我在上传之前删除了错误检查,因为我想让你们阅读得更清楚。无论如何,从我的输出中您可以推断出代码卡在 ReadFile() 处。您还需要在哪里进行错误检查?
  • @S.M.哪一部分不是 C++?
  • char *cmd = "C:...

标签: c++ winapi


【解决方案1】:

我发现了错误。之后要传递的命令不应以/k 开头,而应以\n 结尾。然后程序工作。另外,在创建过程中,/k之后可能没有任何东西,程序仍然可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多