我现在想利用C++命名管道调用 android adb 工具,但是貌似只能输入一次命令。
但是我想通过adb命令操作 android上的sqlite3 数据库,操作两次命令 <c:>adb shell sqlite3 /数据库路径sqlite> select * from data;
这样完成
没做过,求指导!
但是我想通过adb命令操作 android上的sqlite3 数据库,操作两次命令 <c:>adb shell sqlite3 /数据库路径sqlite> select * from data;
这样完成
没做过,求指导!
解决方案 »
- 关于大文件的ANSI转UNICODE问题
- 问个诡异的问题: MAKEINTRESOURCE()
- 请教zlib压缩文件
- CAsyncSocket关闭的时候怎么检测不到呢
- 多视图问题
- 在一个dialog里如何包含一个edit控件类?
- IGraphBuilder过滤ICaptureGraphBuilder2捕获,然后怎样保存数据?
- Why? that's easy! Help me!
- 請問 console(main()) 程序怎麼在系統中隱藏,ctrl+alt+del 按也看不到,謝謝!!
- 大家好
- win2003操作系统下iocp(完成端口)死机问题(续)
- 如何实现鼠标拖动任意控件或图片?有代码最好。没有给点原理。。
命名管道的使用:
server端:
CreateNamedPipe->ConnectNamePipe->ReadFile/WriteFile->DisconnectNamePipe
client端
WaitNamePipe->CreateFile->WriteFile/ReadFile
读写肯定不是同一个管道啊,输入一个管道、输出一个管道,然后管道一端由你的进程操作,另一端应该由你创建的进程操作,这样理解应该够形象了。给你点代码片断,剩下应该能自己解决了
HANDLE hReadPipeIn, hWritePipeIn;
HANDLE hReadPipeOut, hWritePipeOut;
SECURITY_ATTRIBUTES saAttr = { sizeof(SECURITY_ATTRIBUTES) };
saAttr.bInheritHandle = TRUE;
::CreatePipe(&hReadPipeIn, &hWritePipeIn, &saAttr, 0);
::CreatePipe(&hReadPipeOut, &hWritePipeOut, &saAttr, 0);
STARTUPINFO si = { sizeof(si) };
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.hStdInput = hReadPipeIn;
si.hStdOutput = hWritePipeOut;
si.hStdError = hWritePipeOut;
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; }