匿名管道实现重定向输入输出,执行adb命令()?
我想通过调用adb。exe 这个控制台程序多次执行shell 命令,但是执行完第二条命令,再次通过writefile输入的时候就无法执行,通过readFile 读出的数据是第三次写入的数据。
源码。。。
希望知道的朋友能不吝赐教,分数不是问题。
源码。。。
char szconmand[MAX_PATH]={0};
HANDLE stdOutPipeRd,stdOutPipeWt,stdInPipeWt,stdInPipeRd;
STARTUPINFOA startUp;
SECURITY_ATTRIBUTES lpSecurity, lpSec2;
PROCESS_INFORMATION processInfo;
lpSecurity.nLength=sizeof(SECURITY_ATTRIBUTES);
lpSecurity.lpSecurityDescriptor=NULL;
lpSecurity.bInheritHandle=true;
if (!CreatePipe(&stdOutPipeRd,&stdOutPipeWt,&lpSecurity,0))
{
DWORD err=GetLastError();
return -1;
}
lpSec2.nLength=sizeof(SECURITY_ATTRIBUTES);
lpSec2.bInheritHandle=true;
lpSec2.lpSecurityDescriptor=NULL;
if (!CreatePipe(&stdInPipeRd,&stdInPipeWt,&lpSec2,0))
{
DWORD err=GetLastError();
return -1;
}
memset(&startUp,0,sizeof(STARTUPINFOA));
GetStartupInfoA(&startUp);
startUp.cb=sizeof(STARTUPINFOA);
startUp.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
startUp.wShowWindow=HIDE_WINDOW;
startUp.hStdInput=stdOutPipeRd;
startUp.hStdOutput=stdInPipeWt;
startUp.hStdError=stdInPipeWt;
char str[MAX_PATH]={0};
strcpy(str,"adb.exe shell");
char *pdata=NULL;
pdata=(char*)malloc(strlen(str)+strlen(szconmand));
if (pdata==NULL)
{
return -1;
}
memset(pdata,0,strlen(str)+strlen(szconmand));
int n=0;
n=strlen(str);
int k=strlen(szconmand);
memcpy(pdata,str,sizeof(str));
memcpy(pdata+n," ",sizeof(char));
memcpy(pdata+n+1,szconmand,k);
if (!CreateProcessA(NULL,str,NULL,NULL,TRUE,0,NULL,NULL,&startUp,&processInfo))
{
DWORD err=GetLastError();
return -1;
}
DWORD stdlen=0;
char szbuffer[MAX_PATH]={0};
while (true)
{
if(!PeekNamedPipe(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL,0))
{
DWORD err=GetLastError();
return -1;
}
if (stdlen)
{
break;
}
}
if (!ReadFile(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL))
{
DWORD err=GetLastError();
return -1;
}
memset(szbuffer,0,MAX_PATH);
char sqlCommand[MAX_PATH]={0};
strcpy(sqlCommand,"sqlite3 /data/data/com.android.providers.telephony/databases/mmssms.db\r\n");//程序执行到这还是正常的
if (!WriteFile(stdOutPipeWt,sqlCommand,strlen(sqlCommand)+1,&stdlen,0))
{
DWORD erro=GetLastError();
return -1;
}
memset(szbuffer,0,MAX_PATH);
while (true)
{
if(!PeekNamedPipe(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL,0))
{
DWORD err=GetLastError();
return -1;
}
if (stdlen)
{
break;
}
}
if (!ReadFile(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL))//独处正常执行结果
{
DWORD err=GetLastError();
return -1;
}
//memset(szbuffer,0,MAX_PATH);
memset(sqlCommand,0,MAX_PATH);
strcat(szbuffer,"select * from sms;\r\n");
if (!WriteFile(stdOutPipeWt,sqlCommand,strlen(sqlCommand),&stdlen,0))//这次写入的命令,在读的时候是原封不动的被读出来了,没有执行。只能执行两次命令,,,为什么?
{
DWORD erro=GetLastError();
return -1;
}
Sleep(5000);
while (true)
{
memset(szbuffer,0,MAX_PATH);
if(!PeekNamedPipe(stdInPipeRd,szbuffer,MAX_PATH,&stdlen,NULL,0))
{
DWORD err=GetLastError();
return -1;
}
if (stdlen)
{
break;
}
}
if (!ReadFile(stdInPipeRd,szbuffer,1024,&stdlen,NULL))
{
DWORD err=GetLastError();
return -1;
}希望知道的朋友能不吝赐教,分数不是问题。
...全文
相关推荐
C++与ADB通讯匿名管道-双向通讯-.7z
匿名管道双向通讯,可用于替代windows cmd 接管adb输入输出。匿名管道双向通讯,可用于替代windows cmd 接管adb输入输出。
C++实现ADB双向通信匿名管道技术实战
更可靠的方式是编写一个wrapper脚本上传到设备,统一处理输出与状态码:"$@"然后调用:解析输出中正则匹配即可提取状态码。此外,还需区分两类错误:ADB级错误:如设备离线、超时,这类错误发生在命令发送前,应由主控程序捕获;Shell级错误:命令本身失败,exit code ≠ 0,属于业务逻辑判断范畴。基于以上分析,我们正式定义本架构所追求的全双工通信设计目标如下:方向隔离性:输入与输出通道物理分离,杜绝交叉干扰;异步可扩展性。
匿名管道双向通讯
匿名管道双向通讯,可用于替代windows cmd 接管adb输入输出。
vc对cmd命令行返回值监测
vc对cmd命令行返回值监测,本例主要对adb命令返回值的解析。
#include BLEDevice.h.pages
#include BLEDevice.h.pages


进程/线程/DLL
