} 这样访问权限描述就很简单了,代码如下: string strTmp = ""; string strInfo = ""; posbegin = 0; while((posbegin = str.find(permission, posbegin)) != string::npos) { posbegin = posbegin + permission.size(); posend = str.find('\'', posbegin); strTmp.assign(str, posbegin, posend-posbegin); //获取APk使用到的权限 strInfo = m_mapPermission[strTmp]; if(!strInfo.empty()) m_Permission = m_Permission + strInfo + '\n'; posbegin = posend; //下一个 } 这个CAPKHeaper类就讲到这里,大家可以在代码中查看类关系图更详细了解它的流程, 我们接下来看看主程序的逻辑,先看看程序设计的界面,如图8 所示: ![]() 程序的编写基于MFC的对话框,我们看看安装按钮的响应: void CAPKInstallerDlg::OnBnClickedInstall() { if(!m_helper->GetDevices()) { m_syslnkShow.SetWindowText(" 手机未连接或手机驱动没有安装好 ,<a href=“http://www.jybase.net/”>点击此处</a>下载驱动"); return; } if(m_apkPath.empty()) OpenAPK(); if(m_apkPath.empty()) return; m_threadType = THREADF_INSTALL; unsigned int dwThreadID = 0; HANDLE h = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, (LPVOID)this, 0, &dwThreadID); } 线程的创建使用了 WIN32 的_beginthreadex(),所有对 APK 的操作都封装进这个 ThreadProc()线程中,代码如下: unsigned __stdcall CAPKInstallerDlg::ThreadProc( LPVOID lpParam ) { EnterCriticalSection(&g_cs); CAPKInstallerDlg * pWnd = (CAPKInstallerDlg *)lpParam; switch (pWnd->m_threadType) { case THREADF_DEVICES: pWnd->m_syslnkShow.SetWindowText("正在检查已连接的手机"); if(pWnd->m_helper->GetDevices()) { pWnd->m_syslnkShow.SetWindowText("手机连接良好"); } else { pWnd->m_syslnkShow.SetWindowText("手机未连接或手机驱动没有安装好,<a href=\http://www.jybase.net>点击此处</a>下载驱动"); } break; case THREADF_INSTALL: pWnd->m_btnUninstall.EnableWindow(FALSE); pWnd->m_syslnkShow.SetWindowText("正在安装软件..."); 61 pWnd->m_helper->Install(pWnd->m_cbPath.GetCurSel()); pWnd->m_syslnkShow.SetWindowText("软件安装完成"); pWnd->m_btnUninstall.EnableWindow(TRUE); break; case THREADF_UNINSTALL: pWnd->m_btnInstall.EnableWindow(FALSE); pWnd->m_syslnkShow.SetWindowText("正在卸载软件..."); if(pWnd->m_helper->UnInstall()) { pWnd->m_syslnkShow.SetWindowText("软件卸载完成"); } else { pWnd->m_syslnkShow.SetWindowText("软件卸载失败"); } pWnd->m_btnInstall.EnableWindow(TRUE); break; } LeaveCriticalSection(&g_cs); return 1; } 各种操作信息的显示我使用了 syslink 控件,使用它的一个好处就是这个控件支持如 html的链接一样的显示效果,它们的鼠标点击处理代码统一如下: void CAPKInstallerDlg::OnNMClickLinkurl(NMHDR *pNMHDR, LRESULT *pResult) { PNMLINK pNMLink = (PNMLINK)pNMHDR; wstring wstr = pNMLink->item.szUrl; string str = wstring2string(wstr); ::ShellExecute(m_hWnd, "open", str.c_str(), NULL, NULL, SW_SHOWNORMAL); *pResult = 0; } 注意这行:wstring wstr = pNMLink->item.szUrl,syslink 点击消息返回的链接地址 |