ADB管道

bool SmartPhoneSN::Adb_Manager_Init()
{
	HANDLE hread_cmd = NULL, hwrite_out = NULL;
	SECURITY_ATTRIBUTES sa;
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.lpSecurityDescriptor = NULL;
	sa.bInheritHandle = TRUE;

	if (!CreatePipe(&hread_cmd, &hdle_write_cmd, &sa, 0))
	{
		MTRACE (g_hEBOOT_DEBUG, "SmartPhoneSN::Adb_Manager_Init() : CreatePipe() write fail...");
		return FALSE;
	}
	//MTRACE (g_hEBOOT_DEBUG, "Adb_Manager::Adb_Manager_Init(): createpipe1 success!");
	if (!CreatePipe(&hdle_read_out, &hwrite_out, &sa, 0))
	{
		MTRACE (g_hEBOOT_DEBUG, "SmartPhoneSN::Adb_Manager_Init() : CreatePipe() read fail...");
		return FALSE;
	}
	//MTRACE (g_hEBOOT_DEBUG, "Adb_Manager::Adb_Manager_Init(): createpipe2 success!");

	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	GetStartupInfo(&si);
	si.hStdError = hwrite_out;
	si.hStdOutput = hwrite_out;
	si.hStdInput = hread_cmd;
	si.wShowWindow = SW_HIDE;
	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

	if (!CreateProcess("c:\\windows\\system32\\cmd.exe", NULL, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
	{
		//MTRACE_ERR (g_hEBOOT_DEBUG, "Adb_Manager::Adb_Manager_Init(): create cmd.exe process fail!");
		return FALSE;
	}
	//MTRACE (g_hEBOOT_DEBUG, "Adb_Manager::Adb_Manager_Init(): create cmd.exe process success!");

	CloseHandle(hread_cmd);
	CloseHandle(hwrite_out);
	CloseHandle(pi.hThread);
	CloseHandle(pi.hProcess);
	//MTRACE (g_hEBOOT_DEBUG, "Adb_Manager::Adb_Manager_Init(): hdle_write_cmd = %08X, hdle_read_out = %08X",hdle_write_cmd,hdle_read_out);
	return TRUE;
}

int SmartPhoneSN::Adb_Manager_Write(char *cmd_line, int cmd_length)
{
	char cmd_buf[100];
	memset(cmd_buf, 0, sizeof(cmd_buf));
	memcpy(cmd_buf, cmd_line, cmd_length);

	cmd_buf[cmd_length] = '\r';
	cmd_buf[cmd_length + 1] = '\n';
	DWORD bytesWritten = 0;

	if (!WriteFile(hdle_write_cmd, cmd_buf, cmd_length + 2, &bytesWritten, NULL))
	{
		return 0;
	}

	return (int)(bytesWritten);
}

int SmartPhoneSN::Adb_Manager_Read(ADB_READ_BUF *adb_read_buf, int buf_size)
{
	DWORD bytesRead = 0;

	if (!ReadFile(hdle_read_out, adb_read_buf->rd_buf, buf_size, &bytesRead, NULL))
	{
		return 0;
	}
	adb_read_buf->rd_buf[bytesRead] = '\0';

	return (int)bytesRead;
}



bool SmartPhoneSN::Adb_WR_Cmd(char *cmd_line, int cmd_length)
{

	if (!(Adb_Manager_Write(cmd_line, cmd_length)))
	{
		return FALSE;
	}
	Sleep(800);
	memset(&read_buf, 0, r_bufsize);
	if (!(Adb_Manager_Read(&read_buf, r_bufsize)))
	{
		return FALSE;
	}
	MTRACE (g_hEBOOT_DEBUG, "SmartPhoneSN::Adb_WR_Cmd(): read_buf is = %s", read_buf.rd_buf);
	return TRUE;
}

int SmartPhoneSN::Adb_Manager_Deinit()
{

	//Adb_WR_Cmd("exit",strlen("exit"));
	Adb_WR_Cmd("adb kill-server", strlen("adb kill-server"));
	//  MTRACE(g_hEBOOT_DEBUG, "ATB_MR::Scan_Devices_FunProc(): close cmd.exe");
	memset(&read_buf, 0, r_bufsize);
	CloseHandle(hdle_write_cmd);
	//  MTRACE(g_hEBOOT_DEBUG, "Adb_Manager::~Adb_Manager(): close hdle_write_cmd");
	CloseHandle(hdle_read_out);
	//  MTRACE(g_hEBOOT_DEBUG, "Adb_Manager::~Adb_Manager(): close hdle_read_out");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在进行vc(Visual C++)对adbAndroid Debug Bridge)的管道操作时,我们可以使用ShellExecute函数来执行adb命令,并且通过popen函数将adb命令的输出结果读取到程序中。 首先,在vc中包含Windows.h头文件来使用系统函数。然后可以通过创建一个子进程来执行adb命令,例如使用ShellExecute函数来执行adb shell命令,如下所示: ```c++ #include <Windows.h> #include <iostream> int main() { // 创建子进程执行adb命令 ShellExecute(NULL, "open", "adb", "shell", NULL, SW_HIDE); return 0; } ``` 另外,如果需要读取adb命令的输出结果,可以使用popen函数,如下所示: ```c++ #include <Windows.h> #include <iostream> int main() { // 创建子进程执行adb命令 FILE* pipe = _popen("adb devices", "r"); if (pipe != NULL) { // 读取adb命令输出结果 char buffer[128]; while (!feof(pipe)) { if (fgets(buffer, 128, pipe) != NULL) { std::cout << buffer; } } _pclose(pipe); } return 0; } ``` 在以上示例中,我们使用_popen函数来执行adb devices命令,并通过循环读取pipe来获取adb命令的输出结果,并通过std::cout输出到控制台。 这样,通过以上的方法,我们可以在vc中对adb进行管道操作,实现与adb的交互和数据传输。 ### 回答2: 在使用VC(Visual C++)来对adbAndroid Debug Bridge)进行管道操作,可以通过以下步骤: 1. 首先,通过启动adb命令来建立与Android设备的连接。可以使用CreateProcess函数创建一个带有adb路径和参数的进程。 2. 调用CreatePipe函数创建一个管道,以便在进程间进行通信。这个函数会返回两个文件句柄,一个用于读取,一个用于写入。 3. 然后,用GetStdHandle函数获取当前进程标准输出句柄(stdout),并将其重定向到管道的写入端。这样,通过写入管道,就可以将输出从adb命令传递给应用程序。 4. 使用ReadFile函数从管道的读取端读取adb命令的输出结果。这样,就可以获取adb命令的输出,并在应用程序中进行处理。 5. 当不再需要与adb进行通信时,使用CloseHandle函数关闭管道的读取和写入句柄。 通过以上步骤,就可以实现使用VC来对adb进行管道操作。在操作过程中,需要注意路径和参数的正确设置,以确保adb命令能够正确执行,并且及时关闭管道句柄以避免资源泄漏。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值