6
回答
VC++ 程序中怎样使用adb 指令
终于搞明白,存储TCO原来是这样算的>>>   

我在电脑如下命令符输入adb指令都能正确执行

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\42c>adb shell
shell@android :/ $ cd sdcard
cd sdcard
shell@android :/sdcard $ ls
ls
Alarms
Android
ApabiReader
Backucup
BaiduMap
BaiduMapSDK
CarConnect
CloudDrive
DCIM
Download
HWThemes
HwMeWidget
KingsoftOffice
Log
Movies
Music
Notifications
Pictures
Podcasts
PushService
QIYIVideo
QQSecureDownload
QQ_Screenshot
QiYiVideo_Local
Recordings
Ringtones
TencentMapSDK
ThunderDownload
UCDownloads

但是当我使用VC++ 编写控制台程序,调用system函数执行adb shell语句可以成功

再去执行cd sdcard和ls指令就无法成功

怎样编写windows程序执行adb指令

管道我也尝试了不行

举报
阿宾
发帖于3年前 6回/2K+阅
共有6个答案 最后回答: 3年前
我有些凌乱了。。。adb这个shell里面的东西,和windows平台下执行某个程序,好像没什么关系吧。补充一下,你尝试对adb的输入输出重定向试试。哈
需要用CreateProcess + 管道重定向做这个。运行adb进程后,将adb进程的输入输出管道重定向到你的程序中,然后向adb进程输出你需要运行的命令。代码比较麻烦,具体请百度

看楼主的代码,system("adb shell") 与system("cd sdcard")都不是一个进程了,环境变量都不一样了,如何能狗成功呢。二楼说的管道还是没错的,这种东西写一个脚本容易的多。

@echo off
adb shell
cd sdcard
ls
goto :EOF




引用来自“中山野鬼”的评论

我有些凌乱了。。。adb这个shell里面的东西,和windows平台下执行某个程序,好像没什么关系吧。补充一下,你尝试对adb的输入输出重定向试试。哈

我写了windows控制台程序,如下两个源码,第一个可以正确执行,但是需要重定向输入批处理

第二个执行第一句后就不能够继续执行下去,原因是什么?

 

第一个程序源码

void main()
{

char cmdstr[1000];
char path[1024];
FILE *f;
sprintf(cmdstr,"%s%s\n", "cd sdcard\n", "ls\n");

f=fopen("tmp.bat","w");
fprintf(f,"%s",cmdstr);
fclose(f);
system("adb shell < tmp.bat");


remove("tmp.bat");

}

 

 

第二个程序源码

void main()
{

system("adb shell");
system("cd sdcard");
system("ls");

}

 

--- 共有 1 条评论 ---
Force武装卫队前一个本质是批处理罢了。 3年前 回复

引用来自“realanan”的评论

需要用CreateProcess + 管道重定向做这个。运行adb进程后,将adb进程的输入输出管道重定向到你的程序中,然后向adb进程输出你需要运行的命令。代码比较麻烦,具体请百度

我使用两个管道代码如下,创建进程时的指令可以执行,并且可以从输出管道读出输出,但是到我用输入管道,写指令到进程时,adb指令不执行

代码如下:
const int PIPE_BUFFER_SIZE = 1024;
 HANDLE hReadPipe;
 HANDLE hWritePipe;
 HANDLE hReadPipecmd;
 HANDLE hWritePipecmd;

 STARTUPINFO          adbProcStartup;
 SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES),NULL, TRUE };
 BOOL bResult = CreatePipe(&hReadPipe, &hWritePipe ,&sa, PIPE_BUFFER_SIZE);
 if( bResult == 0 )
  return 0;

  bResult = CreatePipe(&hReadPipecmd, &hWritePipecmd ,&sa, PIPE_BUFFER_SIZE);
 if( bResult == 0 )
  return 0;

 PROCESS_INFORMATION  adbProcInfo;
 memset(&adbProcInfo, 0, sizeof(PROCESS_INFORMATION));
 memset(&adbProcStartup, 0, sizeof(STARTUPINFO));
 adbProcStartup.cb          = sizeof(STARTUPINFO);
 adbProcStartup.dwFlags     = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;

 adbProcStartup.hStdOutput  = hWritePipe; 
 adbProcStartup.hStdInput   = hReadPipecmd;

 adbProcStartup.wShowWindow = SW_HIDE;

 if(CreateProcess(L"F:\\android\\adb.exe", L"adb install F:\\xunlei.apk", NULL, NULL, TRUE, 0, NULL,
   NULL, &adbProcStartup, &adbProcInfo))                                    //startup adb.exe
  {
   
   
  char szFileBuf[PIPE_BUFFER_SIZE] ={0};                               
  DWORD dwByteRead = 0;
  
  ReadFile(hReadPipe, szFileBuf, PIPE_BUFFER_SIZE, &dwByteRead, NULL); 
  printf("readfile:%s\r\n", szFileBuf);


  memset(szFileBuf, 0, PIPE_BUFFER_SIZE);
  strcpy( szFileBuf, "adb devices");         //第二条指令,写到adb进程,但不会执行
  WriteFile(hWritePipecmd,szFileBuf ,strlen(szFileBuf), &dwByteRead, NULL);
   

  ReadFile(hReadPipe, szFileBuf, PIPE_BUFFER_SIZE, &dwByteRead, NULL);  //read data from pipe
  printf("readfile:%s\r\n", szFileBuf);

  }

要等上一条指令执行完,才能写下一条指令,
因为通过管道不清楚进程会输出多少字节,读多了就会一直卡在那里等(后面的代码永远不会执行),所以需要用到 PeekNamedPipe 不断的尝试是不是读到了你需要的内容,另外还要考虑到可能有错误输出,这东西要弄好还是有点麻烦的。 


顶部