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

第一次使用匿名管道,还很不熟练,哪里不完善的地方请评论指正,不胜感激。工作中需要写一个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空间需要足够大。函数执行完毕后需要关闭句柄,待下次执行后重新创建。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值