JasonYANG17 2023-02-01 15:18 采纳率: 93.3%
浏览 22
已结题

无法管道传输CMD命令

我想使用管道传输cmd的输出结果到控件上,但是发现在执行adb命令时提示创建进程错误,我要如何解决这个错误?
请修改下。adb shell getprop ro.product.model我想执行这个命令并在文本框输出命令执行结果(也就是手机型号),
是否有方法可以在控件输出adb命令执行结果?感谢
麻烦给出可以在MFC中运行的格式代码


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("C:\\android-sdk\\platform-tools\\adb");
    CString output = executeCmd(cmdString);
    SetDlgItemText(IDC_EDIT1, output);
}



  • 写回答

2条回答 默认 最新

  • 快撑死的鱼 2023-02-01 23:13
    关注

    回答不易,求求您采纳点赞哦

    要在 MFC 中运行 ADB 命令“adb shell getprop ro.product.model”并在文本框中显示输出,您可以使用以下代码:

    
    #include <afx.h>
    #include <afxwin.h>
    #include <Windows.h>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void RunCmd(CString cmd, CEdit* pEdit) {
      SECURITY_ATTRIBUTES saAttr;
      saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
      saAttr.bInheritHandle = TRUE;
      saAttr.lpSecurityDescriptor = NULL;
    
      HANDLE hRead, hWrite;
      if (!CreatePipe(&hRead, &hWrite, &saAttr, 0)) {
        pEdit->SetWindowTextW(L"Error creating pipe");
        return;
      }
    
      STARTUPINFOW siStartupInfo;
      ZeroMemory(&siStartupInfo, sizeof(STARTUPINFOW));
      siStartupInfo.cb = sizeof(STARTUPINFOW);
      siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
      siStartupInfo.wShowWindow = SW_HIDE;
      siStartupInfo.hStdOutput = hWrite;
      siStartupInfo.hStdError = hWrite;
    
      PROCESS_INFORMATION piProcessInfo;
      ZeroMemory(&piProcessInfo, sizeof(PROCESS_INFORMATION));
    
      wchar_t buffer[4096];
      wcscpy_s(buffer, cmd);
    
      if (!CreateProcessW(NULL, buffer, NULL, NULL, TRUE, 0, NULL, NULL, &siStartupInfo, &piProcessInfo)) {
        pEdit->SetWindowTextW(L"Error creating process");
        return;
      }
    
      CloseHandle(hWrite);
    
      DWORD dwRead;
      string strOutput;
      while (ReadFile(hRead, buffer, 4096, &dwRead, NULL)) {
        strOutput.append(buffer, dwRead);
      }
    
      pEdit->SetWindowTextW(strOutput.c_str());
    
      CloseHandle(hRead);
      CloseHandle(piProcessInfo.hProcess);
      CloseHandle(piProcessInfo.hThread);
    }
    
    // Example usage:
    void CMyDlg::OnBtnClick() {
      RunCmd(_T("adb shell getprop ro.product.model"), &m_edit);
    }
    
    
    

    请注意,此代码假定 ADB 可执行文件位于系统 PATH 中。如果不是,则需要在命令字符串中指定 ADB 可执行文件的完整路径。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月10日
  • 已采纳回答 2月2日
  • 修改了问题 2月1日
  • 修改了问题 2月1日
  • 展开全部

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分