先上代碼吧
有不懂得可以提問啊!
#include <iostream>#include <vector>#include <map>#include <Windows.h>#include <tchar.h>#include <process.h>#include <Strsafe.h>void CreateProcessInJob(PTSTR sCommangline, HANDLE hJob){STARTUPINFO stInfo = {sizeof(stInfo)};PROCESS_INFORMATION process_info = {0};int len = _tcsclen(sCommangline) * sizeof(TCHAR);int lSize = len + sizeof(TCHAR);PTSTR pBuffer = new TCHAR[lSize];memset(pBuffer,0,lSize);// size 必須要加上NULL字元StringCbCopy(pBuffer,lSize,sCommangline);// 參數2 的緩衝區要可寫,訪問違規BOOL bOk = CreateProcess(NULL,pBuffer,NULL,NULL,FALSE,CREATE_BREAKAWAY_FROM_JOB|CREATE_SUSPENDED,NULL,NULL,&stInfo,&process_info);__try{if(!bOk)__leave;AssignProcessToJobObject(hJob,process_info.hProcess);// 啟用線程::ResumeThread(process_info.hThread);}__finally{delete []pBuffer;pBuffer = NULL;//關閉進程對象,線程對象CloseHandle(process_info.hProcess);CloseHandle(process_info.hThread);}}unsigned int WINAPI ThreadFunc(LPVOID lparam){HANDLE hIOCP = (HANDLE)lparam;BOOL bGoOn = TRUE;DWORD dwlen = 0;DWORD dwProcessID;ULONG_PTR comkey;LPOVERLAPPED ov;while(bGoOn && GetQueuedCompletionStatus(hIOCP,&dwlen,&comkey,&ov,INFINITE)){if (comkey == 1){switch (dwlen){case JOB_OBJECT_MSG_EXIT_PROCESS:dwProcessID = (DWORD)ov;printf("process ID %d\n",dwProcessID);break;case JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO:printf("over all");ov;bGoOn = FALSE;break;case JOB_OBJECT_MSG_NEW_PROCESS:printf("new process ID %d\n",(DWORD)ov);break;}}}return 0;}int main( ){// Get the list of process identifiers.HANDLE hJob=NULL;HANDLE hIOPort = NULL;HANDLE hThread = NULL;ULONG_PTR completionKey = 1; // user-defined__try{hJob= CreateJobObject(NULL,TEXT("myJob"));if(NULL == hJob){__leave;}JOBOBJECT_BASIC_UI_RESTRICTIONS tagUiRestrictions;tagUiRestrictions.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE;tagUiRestrictions.UIRestrictionsClass = JOB_OBJECT_UILIMIT_HANDLES | JOB_OBJECT_UILIMIT_EXITWINDOWS;BOOL bOk = SetInformationJobObject(hJob,JobObjectBasicUIRestrictions,&tagUiRestrictions,sizeof(tagUiRestrictions));if (!bOk){__leave;}hIOPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL, completionKey, 0);if (hIOPort == NULL){__leave;}JOBOBJECT_ASSOCIATE_COMPLETION_PORT tagAssCompletionPort;tagAssCompletionPort.CompletionKey= (PVOID)completionKey;tagAssCompletionPort.CompletionPort = hIOPort;bOk = SetInformationJobObject(hJob,JobObjectAssociateCompletionPortInformation,&tagAssCompletionPort,sizeof(tagAssCompletionPort));if (!bOk){__leave;}hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, hIOPort, 0, NULL);if (hThread == NULL){__leave;}CreateProcessInJob(TEXT("C:\\Program Files\\Microsoft Visual Studio 8\\Common7\\Tools\\spyxx.exe"),hJob);CreateProcessInJob(TEXT("C:\\Users\\Administrator\\Desktop\\procexp.exe"),hJob);WaitForSingleObject(hThread, INFINITE);}__finally{CloseHandle(hJob);CloseHandle(hIOPort);CloseHandle(hThread);hIOPort = hIOPort = hThread = NULL;}system("pause");return 0;}