您的位置:首页 > 移动开发 > Android开发

利用匿名管道向Android手机发送adb命令

2015-01-13 19:12 246 查看
第一次使用匿名管道,还很不熟练,哪里不完善的地方请评论指正,不胜感激。工作中需要写一个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空间需要足够大。函数执行完毕后需要关闭句柄,待下次执行后重新创建。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  控制台 win32 cmd c