JasonYANG17 2023-02-01 11:31 采纳率: 93.3%
浏览 30
已结题

管道传输不了CMD命令

我想使用管道传输cmd的输出结果到控件上,但是发现在执行adb命令时提示创建进程错误,我要如何解决这个错误?
请修改下。


HCURSOR CMFCApplication6Dlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}
TCHAR* StringToChar(CString& str)
{
    int len = str.GetLength();
    TCHAR* tr = str.GetBuffer(len);
    str.ReleaseBuffer();
    return tr;
}
CString executeCmd(CString command)
{

    //创建匿名管道
    HANDLE hReadPipe, hWritePipe;
    SECURITY_ATTRIBUTES safety;                        //安全属性    
    safety.nLength = sizeof(SECURITY_ATTRIBUTES);    //结构体大小
    safety.lpSecurityDescriptor = NULL;                //安全描述符,NULL;使用默认的
    safety.bInheritHandle = TRUE;                    //安全描述符的对象能否被子进程继承
    if (!CreatePipe(&hReadPipe, &hWritePipe, &safety, 0))
    {
        //创建管道错误
        return _T("创建管道错误!");
    }
    //创建进程
    TCHAR* cmdStr = StringToChar(command);
    STARTUPINFO startupInfo = { sizeof(startupInfo) };                    //进程信息    
    startupInfo.hStdError = hWritePipe;                                    //标志控制台窗口缓存
    startupInfo.hStdOutput = hWritePipe;                                //标志控制台窗口缓存
    startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;    //使用wSHOWWIndows成员
    startupInfo.wShowWindow = SW_HIDE;
    PROCESS_INFORMATION pinfo;
    if (!CreateProcess(NULL, cmdStr, NULL, NULL, TRUE, NULL, NULL, NULL, &startupInfo, &pinfo))
    {
        //创建进程错误
        return _T("创建进程错误!");
    }
    CloseHandle(hWritePipe);

    //获取管道信息
    char buffer[4096];
    DWORD byteRead;
    CString output;                                    //返回值
    while (true)
    {
        memset(buffer, 0, 4096);                    //要放在循环里面,否则接收数据错乱
        if (ReadFile(hReadPipe, buffer, 4095, &byteRead, NULL) == NULL)
        {
            break;
        }
        output += buffer;
    }
    CloseHandle(hReadPipe);

    return output;
}
void CMFCApplication6Dlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
    CString cmdString = _T("adb");
    CString output = executeCmd(cmdString);
    SetDlgItemText(IDC_EDIT1, output);
}


  • 写回答

1条回答 默认 最新

  • m0_54204465 2023-02-01 12:20
    关注

    看到你的代码,现在的问题是创建进程的时候发生了错误。

    一种可能的原因是adb命令的路径没有在系统的环境变量中,因此Windows不知道如何找到它。

    你可以尝试把完整的路径加入到cmdString中。例如:

    CString cmdString = _T("C:\\android-sdk\\platform-tools\\adb");
    
    

    还有一种可能的原因是该命令不能在管道中执行。某些命令需要与控制台交互,因此不能在管道中执行。

    请尝试在命令提示符窗口中手动运行命令,以确定问题的原因。
    补充:如果您想使用system()函数从C++代码中运行adb命令并获取其结果,则可以这样实现:

    #include <iostream>
    #include <cstdio>
    
    int main() {
      std::string cmd = "adb shell getprop ro.product.model";
      FILE *pipe = popen(cmd.c_str(), "r");
      if (!pipe) {
        return 1;
      }
    
      char buffer[128];
      std::string result = "";
      while (!feof(pipe)) {
        if (fgets(buffer, 128, pipe) != NULL) {
          result += buffer;
        }
      }
      pclose(pipe);
    
      std::cout << result << std::endl;
      return 0;
    }
    
    

    该代码将执行adb shell getprop ro.product.model命令,并将命令的输出存储在结果字符串中。最后,它将结果打印到控制台。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 创建了问题 2月1日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么