multimap实例 -- 添加、遍历数据
1 #pragma warning(disable:4786) 2 #include <map> 3 using namespace std ; 4 5 typedef HANDLE (WINAPI *_OPENTHREAD)(DWORD, BOOL, DWORD);//动态调用Dll
1 multimap<DWORD, HANDLE> m_ProcessThread;//定义multimap
1 //挂起进程 2 void CXTDlg::OnProcessSuspend() 3 { 4 //获取当前选中进程(ListCtrl) 5 POSITION pos = m_ctrlProcessList.GetFirstSelectedItemPosition(); 6 int nIndex = m_ctrlProcessList.GetNextSelectedItem(pos); 7 8 //读取进程ID 9 DWORD dwProcessID = 0; 10 char szTmp[MAX_PATH] = {0}; 11 m_ctrlProcessList.GetItemText(nIndex, 1, szTmp, MAX_PATH); 12 dwProcessID = strtoul(szTmp, NULL, 10); 13 14 //获取指定进程的线程快照 15 HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessID); 16 if (hThreadSnap == INVALID_HANDLE_VALUE) 17 { 18 return; 19 } 20 21 //遍历线程 22 THREADENTRY32 te32 = {0}; 23 te32.dwSize = sizeof(THREADENTRY32); 24 if (Thread32First(hThreadSnap, &te32)) 25 { 26 do 27 { 28 if (te32.th32OwnerProcessID == dwProcessID) 29 { 30 //挂起线程 31 HMODULE hDll = LoadLibrary("Kernel32.dll"); 32 _OPENTHREAD OpenThread = (_OPENTHREAD)GetProcAddress(hDll, "OpenThread"); 33 HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te32.th32ThreadID); 34 SuspendThread(hThread); 35 36 //存储线程句柄 37 m_ProcessThread.insert(multimap<DWORD, HANDLE>::value_type(dwProcessID, hThread)); 38 } 39 } 40 while (Thread32Next(hThreadSnap, &te32)); 41 } 42 else 43 { 44 return;; 45 } 46 47 //释放快照资源 48 CloseHandle (hThreadSnap); 49 } 50 51 52 //恢复进程 53 void CXTDlg::OnProcessResume() 54 { 55 //获取当前选中进程 56 POSITION pos = m_ctrlProcessList.GetFirstSelectedItemPosition(); 57 int nIndex = m_ctrlProcessList.GetNextSelectedItem(pos); 58 59 //读取进程ID 60 DWORD dwProcessID = 0; 61 char szTmp[MAX_PATH] = {0}; 62 m_ctrlProcessList.GetItemText(nIndex, 1, szTmp, MAX_PATH); 63 dwProcessID = strtoul(szTmp, NULL, 10); 64 65 //遍历multimap,获取线程句柄 66 typedef multimap<DWORD, HANDLE>::iterator multiMapItor; 67 pair<multiMapItor,multiMapItor> doubleIter = m_ProcessThread.equal_range(dwProcessID); 68 while(doubleIter.first != doubleIter.second) 69 { 70 if (doubleIter.first->second) 71 { 72 //恢复线程 73 ResumeThread(doubleIter.first->second); 74 //释放线程资源 75 CloseHandle(doubleIter.first->second); 76 doubleIter.first->second = NULL; 77 } 78 ++doubleIter.first; 79 } 80 }