利用匿名管道向Android手机发送adb命令
2015-01-13 19:12
381 查看
第一次使用匿名管道,还很不熟练,哪里不完善的地方请评论指正,不胜感激。工作中需要写一个dll,实现对android手机的操作,并将此函数作为接口导出。手机连接电脑的时候,用adb命令可以直接在控制台对手机进行操作,封装到win32程序里面的整体流程是首先创建匿名管道,然后创建cmd进程,同时把adb命令作为cmd的参数传入,之后从匿名管道输出端读出返回的数据,代码如下:
// 通过匿名管道执行adb命令BOOL WINAPI AdbCommand(LPCWSTR lpCommand, static LPSTR lpOutput) { BOOL bRet = FALSE; DWORD dwErr = 0; DWORD dwStdLen = 0; DWORD dwReadLen = 0; DWORD dwExitCode = 0; CHAR szBuffer[BUFFER_SIZE] = {NULL}; WCHAR wzCommand[BUFFER_SIZE] = {NULL}; STARTUPINFOW stStartupInfo; SECURITY_ATTRIBUTES stSecurityOutPipe, stSecurityInPipe; PROCESS_INFORMATION stProcessInfo; HANDLE stdOutPipeRd,stdOutPipeWt; // 初始化安全描述符 stSecurityOutPipe.nLength = sizeof(SECURITY_ATTRIBUTES); stSecurityOutPipe.lpSecurityDescriptor = NULL; stSecurityOutPipe.bInheritHandle = TRUE; stSecurityInPipe.nLength = sizeof(SECURITY_ATTRIBUTES); stSecurityInPipe.lpSecurityDescriptor = NULL; stSecurityInPipe.bInheritHandle = TRUE; // 初始化结构体 ZeroMemory(&stStartupInfo, sizeof(STARTUPINFOW)); ZeroMemory(&stProcessInfo, sizeof(PROCESS_INFORMATION)); // 为子进程创建STDOUT管道 if (!CreatePipe(&stdOutPipeRd, &stdOutPipeWt, &stSecurityOutPipe, 0)) { dwErr = GetLastError(); return bRet; } // 创建子进程 stStartupInfo.cb = sizeof(STARTUPINFOW); stStartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; stStartupInfo.hStdOutput = stdOutPipeWt; stStartupInfo.hStdError = stdOutPipeWt; stStartupInfo.wShowWindow = SW_HIDE; wsprintfW(wzCommand, L"cmd.exe /c %s", lpCommand); if (!CreateProcessW(NULL, wzCommand, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &stStartupInfo, &stProcessInfo)) { dwErr = GetLastError(); return bRet; } WaitForSingleObject(stProcessInfo.hProcess, INFINITE); if (PeekNamedPipe(stdOutPipeRd, NULL, 0, NULL, &dwReadLen, NULL)) { bRet = TRUE; } if (dwReadLen > 0) { memset(szBuffer, 0, sizeof(szBuffer)); ReadFile(stdOutPipeRd, szBuffer, dwReadLen, &dwStdLen, NULL); lstrcpyA(lpOutput, szBuffer); bRet = TRUE; } CloseHandle(stProcessInfo.hProcess); CloseHandle(stProcessInfo.hThread); CloseHandle(stdOutPipeRd); CloseHandle(stdOutPipeWt); return bRet; } </span>其中参数lpCommand是adb命令,lpOutput用来接收adb命令执行完成之后返回的数据。创建进程时dwCreationFlags参数需要设置为CREATE_NEW_CONSOLE,并且创建完进程后需要等待进程返回再继续执行,避免adb命令还没执行完就去读返回结果,导致无结果返回。adb返回的字符串是ANSI字符串,用来接收返回结果的lpOutput空间需要足够大。函数执行完毕后需要关闭句柄,待下次执行后重新创建。
相关文章推荐
- 利用匿名管道向Android手机发送adb命令
- 利用匿名管道向Android手机发送adb命令
- 利用匿名管道向Android手机发送adb命令
- 利用匿名管道向Android手机发送adb命令
- 利用匿名管道向Android手机发送adb命令
- 利用匿名管道向Android手机发送adb命令
- 利用匿名管道向Android手机发送adb命令
- 利用匿名管道向Android手机发送adb命令
- Android_利用 adb 命令把电脑和 Android 手机通过 WIFI 进行连接,从此安装应用不需要数据线
- 利用adb命令来测试Android手机App的耗电量
- Mac系统下利用ADB命令连接android手机并进行文件操作
- Mac系统下利用ADB命令连接android手机并进行文件操作
- Mac系统下利用ADB命令连接android手机并进行文件操作
- Mac和Windows系统下利用ADB命令连接android手机文件操作安装卸载
- android adb 命令发送 keyevent
- Android adb 命令发送短信 && 拨打电话
- Android手机系统adb操作命令详解
- android adb 命令发送 keyevent
- 通过adb命令获取Android手机的IP地址
- Android SystemProperties 和 ADB shell 命令查看手机状态