VC中的adb通信

本文记录了在VC开发中如何使用ADB与Android设备进行通信的过程,包括启动后台工作者线程,创建管道和socket连接,执行ADB指令如启动服务、安装apk等,最终实现设备的控制与交互。
摘要由CSDN通过智能技术生成

以前的工作中涉及到了VC开发PC软件通过ADB通信与android设备连接的内容,现在简单记录下连接的流程
vc在界面初始化时启动后台工作者线程

bool CHPadSuiteDlg::StartThread()
{
    //启动线程
    // create events
    if (hAdbEvent != NULL)
    {
        ResetEvent(hAdbEvent);
    }
    else
    {
        hAdbEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    }
    if (hWriteEvent != NULL)
    {
        ResetEvent(hWriteEvent);
    }
    else
    {
        hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    }
    if (hCloseEvent != NULL)
    {
        ResetEvent(hCloseEvent);
    }
    else
    {
        hCloseEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    }
    hEventArray[0] = hCloseEvent; // highest priority
    hEventArray[1] = hAdbEvent;
    hEventArray[2] = hWriteEvent;
    theApp.adbCommandPipe.init();
    if (theApp.winThread = AfxBeginThread(AdbThread, this))
    {
        return true;
    }
    else
    {
        //发送失败消息
        AfxMessageBox(theApp.GetResString(IDS_FAIL_THREAD));
        SendMessage(WM_CLOSE);
        return false;
    }
}

这当中以管道的方式与adb创建链接

CPipe adbCommandPipe;//管道

然后是启动这个工作者线程

//工作者线程在后台工作,负责向设备发送adb命令
UINT CHPadSuiteDlg::AdbThread(LPVOID pParam)
{
    CHPadSuiteDlg* pHandle = (CHPadSuiteDlg*)pParam;
    pHandle->bThreadAlive = TRUE;
    DWORD Event = 0;

    for (;;)
    {
        Event = WaitForMultipleObjects(3, pHandle->hEventArray, FALSE, INFINITE);
        switch (Event)
        {
        case 0:
            {
                // Kill this thread.  break is not needed, but makes me feel better.
                pHandle->bThreadAlive = FALSE;
                theApp.exitThread = true;
                TRACE(_T("***thread exit \r\n"));
                AfxEndThread(100);
                Sleep(100);
            }
            break;
        case 1:
            {
                ResetEvent(pHandle->hAdbEvent);
                TRACE(_T("***thread adb cmd \r\n"));
                if(theApp.adbcmd)
                {
                    int rsp = theApp.adbCommandPipe.SendCommand(theApp.adbcmd->cmd,NULL,theApp.adbcmd->waitResponse);
                    if(rsp < 32)
                    {
                        ::SendMessage(theApp.activeWnd->m_hWnd,WM_USER_FAILURE, FAIL_CREATE_PIPE, 0x0);
                    }
                }
            }
            break;
        case 2:
            {
                theApp.bytesRead = 0;
                ResetEvent(pHandle->hWriteEvent);
                TRACE(_T("***thread write \r\n"));
                //int rsp = theApp.adbCommandPipe.SendCommand(theApp.AdbFilePreName + theApp.strCommand,NULL,theApp.waitResponse);
                int rsp = theApp.adbCommandPipe.SendCommand(theApp.strCommand,NULL,theApp.waitResponse);
                if(rsp < 32)
                {
                    ::SendMessage(theApp.activeWnd->m_hWnd,WM_USER_FAILURE, FAIL_CREATE_PIPE, 0);
                }
            }
            break;
        }

    }
    return 0;
}

关键的是CPipe类的

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值