我现在想利用C++命名管道调用 android adb 工具,但是貌似只能输入一次命令。
但是我想通过adb命令操作 android上的sqlite3 数据库,操作两次命令 <c:>adb shell sqlite3 /数据库路径sqlite> select * from data;
这样完成
没做过,求指导!

解决方案 »

  1.   

    你管道怎么用的,用管道重定向CreateProcess创建的cmd进程输入输出,然后ReadFile、WriteFile就行
      

  2.   

    问题是我创建了两个管道然后重定向之后执行命令直接就卡死在ReadFile那了,这个是为什么呢?
      

  3.   

    在线等,我是通过管道重定向了,但是当我通过writeFile写入的命令,通过 ReadFile读的时候 把我原来写入的语句读出来了。。根本没有执行!
      

  4.   

    你咋使用管道的,你把代码贴出来看看。
    命名管道的使用:
    server端:
    CreateNamedPipe->ConnectNamePipe->ReadFile/WriteFile->DisconnectNamePipe
    client端
    WaitNamePipe->CreateFile->WriteFile/ReadFile
      

  5.   


    读写肯定不是同一个管道啊,输入一个管道、输出一个管道,然后管道一端由你的进程操作,另一端应该由你创建的进程操作,这样理解应该够形象了。给你点代码片断,剩下应该能自己解决了
    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;
      

  6.   

     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; }