multimap实例 -- 添加、遍历数据
2014-08-02 22:06
316 查看
#pragma warning(disable:4786) #include <map> using namespace std ; typedef HANDLE (WINAPI *_OPENTHREAD)(DWORD, BOOL, DWORD);//动态调用Dll
multimap<DWORD, HANDLE> m_ProcessThread;//定义multimap
//挂起进程 void CXTDlg::OnProcessSuspend() { //获取当前选中进程(ListCtrl) POSITION pos = m_ctrlProcessList.GetFirstSelectedItemPosition(); int nIndex = m_ctrlProcessList.GetNextSelectedItem(pos); //读取进程ID DWORD dwProcessID = 0; char szTmp[MAX_PATH] = {0}; m_ctrlProcessList.GetItemText(nIndex, 1, szTmp, MAX_PATH); dwProcessID = strtoul(szTmp, NULL, 10); //获取指定进程的线程快照 HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessID); if (hThreadSnap == INVALID_HANDLE_VALUE) { return; } //遍历线程 THREADENTRY32 te32 = {0}; te32.dwSize = sizeof(THREADENTRY32); if (Thread32First(hThreadSnap, &te32)) { do { if (te32.th32OwnerProcessID == dwProcessID) { //挂起线程 HMODULE hDll = LoadLibrary("Kernel32.dll"); _OPENTHREAD OpenThread = (_OPENTHREAD)GetProcAddress(hDll, "OpenThread"); HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te32.th32ThreadID); SuspendThread(hThread); //存储线程句柄 m_ProcessThread.insert(multimap<DWORD, HANDLE>::value_type(dwProcessID, hThread)); } } while (Thread32Next(hThreadSnap, &te32)); } else { return;; } //释放快照资源 CloseHandle (hThreadSnap); } //恢复进程 void CXTDlg::OnProcessResume() { //获取当前选中进程 POSITION pos = m_ctrlProcessList.GetFirstSelectedItemPosition(); int nIndex = m_ctrlProcessList.GetNextSelectedItem(pos); //读取进程ID DWORD dwProcessID = 0; char szTmp[MAX_PATH] = {0}; m_ctrlProcessList.GetItemText(nIndex, 1, szTmp, MAX_PATH); dwProcessID = strtoul(szTmp, NULL, 10); //遍历multimap,获取线程句柄 typedef multimap<DWORD, HANDLE>::iterator multiMapItor; pair<multiMapItor,multiMapItor> doubleIter = m_ProcessThread.equal_range(dwProcessID); while(doubleIter.first != doubleIter.second) { if (doubleIter.first->second) { //恢复线程 ResumeThread(doubleIter.first->second); //释放线程资源 CloseHandle(doubleIter.first->second); doubleIter.first->second = NULL; } ++doubleIter.first; } }
相关文章推荐
- LINUX C 数据文件的添加,修改,删除 实例
- 一维数组的遍历、添加、删除、位置移动的实例
- thinkphp数据查询和遍历数组实例
- jquery使用each方法遍历json格式数据实例
- javascript动态创建表格及添加数据实例详解
- (oracle学习笔记)游标实例:通过游标遍历合并数据
- java 遍历request中的所有表单数据的实例代码
- Swift教程_CoreData实例(五)_构建控制层(添加数据)
- 数据文件的添加,修改,删除 实例
- HashSet容器 删除/添加数据实例
- 遍历Dataset并输出数据实例
- 以申购单为实例,讲解Jquery动态删减行,新增行添加鼠标事件,子窗口与父窗口传值,自动计算金额,及输入值的验证,前台数据批量提交到后台action
- LINUX C 数据文件的添加,修改,删除 实例
- js里遍历json数据的一个实例
- 存储过程实例 判断临时表是否存在 循环添加主外键两张表数据
- 遍历网页表格中的某个节点并给该节点添加数据
- 为多核Solr实例添加一个支持默认示例数据的核
- java通过反射机制为实例添加数据
- LINUX C 数据文件的添加,修改,删除 实例
- js 遍历解析json数据添加列表