我想使用管道传输cmd的输出结果到控件上,但是发现在执行adb命令时提示创建进程错误,我要如何解决这个错误?
请修改下。
HCURSOR CMFCApplication6Dlg::OnQueryDragIcon()
{
return static_cast(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);
}
看到你的代码,现在的问题是创建进程的时候发生了错误。
一种可能的原因是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命令,并将命令的输出存储在结果字符串中。最后,它将结果打印到控制台。