我想使用管道传输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);
}
回答不易,求求您采纳点赞哦
要在 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 可执行文件的完整路径。
发现执行Windows命令可以正常运行,而其他命令错误。