N3ptune 2021-10-29 19:24 采纳率: 100%
浏览 96
已结题

Windows程序执行CMD命令 不能得到输出结果

最近在学习Windows远程CMD 遇到一些问题
代码如下:

#include <windows.h>
#include <cstdio>

void ShowError(const char* szText)
{
    char szError[MAX_PATH] = { 0 };
    sprintf_s(szError, "%s: %d\n", szText, GetLastError());
    printf("%s", szError);
}
BOOL PipeCmd(char *szCmdLine, char *szResBuff, DWORD dwResBuffSize)
{
    BOOL bRet = FALSE;
    HANDLE hReadPipe = NULL;
    HANDLE hWritePipe = NULL;
    SECURITY_ATTRIBUTES  SecAttributes = { 0 };
    SecAttributes.bInheritHandle = TRUE;
    SecAttributes.lpSecurityDescriptor = NULL;
    SecAttributes.nLength = sizeof(SecAttributes);
    bRet = CreatePipe(&hReadPipe, &hWritePipe, &SecAttributes, 0);
    if (FALSE == bRet)
    {
        ShowError("CreatePipe");
        return FALSE;
    }
    STARTUPINFO si = { 0 };
    GetStartupInfo(&si);
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    si.hStdOutput = hWritePipe;
    si.hStdError = hWritePipe;
    PROCESS_INFORMATION pi = { 0 };
    bRet = CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (FALSE == bRet)
    {
        ShowError("CreateProcess");
        return FALSE;
    }
    RtlZeroMemory(szResBuff, dwResBuffSize);
    DWORD dwRes;
    ReadFile(hReadPipe, szResBuff, dwResBuffSize, &dwRes, NULL);
    WaitForSingleObject(pi.hThread, INFINITE);
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    return TRUE;
}
int main(int argc, char *argv[])
{
    char szCmdLine[] = "whoami";
    char szResBuff[1024] = { 0 };
    DWORD dwResBuffSize = 1024;
    if (!PipeCmd(szCmdLine, szResBuff, dwResBuffSize))
    {
        printf("Pipe CMD ERROR\n");
    }
    else
    {
        printf("Pipe CMD OK\n");
        printf("%s\n", szResBuff);
    }
    return 0;
}


这段程序的目的是执行命令行命令 并且将输出结果写入管道
将管道数据读入数组 最终打印出数组
简而言之就是用程序执行CMD命令并且输出返回结果

img

但执行程序后得不到任何输出

  • 写回答

3条回答 默认 最新

  • 急速光粒 2021-10-30 08:25
    关注

    代码有两处问题,一是管线关闭的顺序,还有一处是createprocess参数问题,bInHeritHandles也是一定要设置为TRUE,新的进程能输出信息必须继承调用进程的句柄。我都给你修改可以运行了。有运行结果图片如下。有帮助请采纳,谢谢!

    img

    #include <windows.h>
    #include <cstdio>
    #include <processthreadsapi.h>
    void ShowError(const char* szText)
    {
        char szError[MAX_PATH] = { 0 };
        sprintf_s(szError, "%s: %d\n", szText, GetLastError());
        printf("%s", szError);
    }
    BOOL PipeCmd(char *szCmdLine, char *szResBuff, DWORD dwResBuffSize)
    {
        BOOL bRet = FALSE;
        HANDLE hReadPipe = NULL;
        HANDLE hWritePipe = NULL;
        SECURITY_ATTRIBUTES  SecAttributes = { 0 };
        SecAttributes.bInheritHandle = TRUE;
        SecAttributes.lpSecurityDescriptor = NULL;
        SecAttributes.nLength = sizeof(SecAttributes);
        bRet = CreatePipe(&hReadPipe, &hWritePipe, &SecAttributes, 0);
        if (FALSE == bRet)
        {
            ShowError("CreatePipe");
            return FALSE;
        }
        STARTUPINFO si = { 0 };
        GetStartupInfo(&si);
        si.cb = sizeof(si);
        si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_HIDE;
        si.hStdOutput = hWritePipe;
        si.hStdError = hWritePipe;
        PROCESS_INFORMATION pi = { 0 };
        bRet = CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
        if (FALSE == bRet)
        {
            ShowError("CreateProcess");
            return FALSE;
        }
        CloseHandle(hWritePipe);
    
        RtlZeroMemory(szResBuff, dwResBuffSize);
        DWORD dwRes;
        ReadFile(hReadPipe, szResBuff, dwResBuffSize, &dwRes, NULL);
        MessageBox(NULL, szResBuff, "执行结果", MB_OK);
    
        WaitForSingleObject(pi.hThread, INFINITE);
        WaitForSingleObject(pi.hProcess, INFINITE);
        CloseHandle(hReadPipe);
        //CloseHandle(hWritePipe);
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    
        system("pause");
        return TRUE;
    }
    int main(int argc, char *argv[])
    {
        char szCmdLine[] = "whoami";
        char szResBuff[1024] = { 0 };
        DWORD dwResBuffSize = 1024;
        if (!PipeCmd(szCmdLine, szResBuff, dwResBuffSize))
        {
            printf("Pipe CMD ERROR\n");
        }
        else
        {
            printf("Pipe CMD OK\n");
            printf("%s\n", szResBuff);
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月7日
  • 已采纳回答 10月30日
  • 创建了问题 10月29日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助