Написал, код: Код (Text): hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0); if(hProcSnap != INVALID_HANDLE_VALUE) { tentry.dwSize = sizeof(THREADENTRY32); if(Thread32First(hProcSnap,&tentry)) { CountThreads++; for(; Thread32Next(hProcSnap,&tentry); CountThreads++); }//Thread32First pSysInfo = new SYSTEMINFO[CountThreads]; if(Thread32First(hProcSnap,&tentry)) { pSysInfo[0].ThreadID = tentry.th32ThreadID; pSysInfo[0].ProcID = tentry.th32OwnerProcessID; for(int i =1; i < CountThreads; i++) { Thread32Next(hProcSnap,&tentry); pSysInfo[i].ThreadID = tentry.th32ThreadID; pSysInfo[i].ProcID = tentry.th32OwnerProcessID; }//for }//Thread32First CloseHandle(hProcSnap); }//hProcSnapshot for(int i = 0; i < CountThreads; i++) { cout << "ProcID # " << pSysInfo[i].ProcID << "#\t"; cout << "ThreadID # " << pSysInfo[i].ThreadID << endl; } Но код, перечисляет ВСЕ потоки которые есть в системе, а мне нужно толко один, указанный мною! Причем бональным if(GetCurrentProcessId == pSysInfo.ProcID) решать не охота! Вопрос: Есть способ лучше?
Единственный способ в WinNT перечислить все процессы и потоки в системе - NtQuerySystemInformation. Так что используй ее. А как в остальных виндоузах не знаю.
лучше не так Код (Text): if(GetCurrentProcessId == pSysInfo[i].ProcID) а так Код (Text): MyPid = GetCurrentProcessId();... if (MyPid == pSysInfo[i].ProcID) это более эффективно
Код (Text): RESULT GetArrayThreadID(PMYTHREADINFO tinfo,DWORD ProcID) { HANDLE hProcSnap; THREADENTRY32 tentry = {0}; int CountThreads = 0; RESULT ValRet = SUCCESS; try { hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0); if(hProcSnap != INVALID_HANDLE_VALUE) { tentry.dwSize = sizeof(THREADENTRY32); if(Thread32First(hProcSnap,&tentry)) { if(tentry.th32OwnerProcessID == ProcID) CountThreads++; for(; Thread32Next(hProcSnap,&tentry); ) if(tentry.th32OwnerProcessID == ProcID) CountThreads++; }//Thread32First else { ValRet = FAIL; } tinfo->CountThreads = CountThreads; tinfo->ThreadID = new DWORD[CountThreads]; ZeroMemory(tinfo->ThreadID,CountThreads*4); if(Thread32First(hProcSnap,&tentry)) { if(tentry.th32OwnerProcessID == ProcID) tinfo->ThreadID[0] = tentry.th32ThreadID; for(int i=0;Thread32Next(hProcSnap,&tentry);i++) { if(tentry.th32OwnerProcessID == ProcID) tinfo->ThreadID[i] = tentry.th32ThreadID; }//for }//Thread32First else { ValRet = FAIL; } CloseHandle(hProcSnap); if(!CountThreads) tinfo->CountThreads = 0xFFFFFFFF; }//hProcSnapshot else { ValRet = FAIL; } }// try catch(...) { ValRet = FAIL; } return ValRet; } Начал отлаживать...
EvilsInterrupt Начал отлаживать... После повторного Thread32First присваиваешь в _нулевой_ элемент tinfo->ThreadID, а затем цикл с Thread32Next начинается с индекса _ноль_ и индекс этот увеличивается независимо от того принадлежит ли очередной поток нужному процессу или нет. + imho вместо CountThreads*4 надо писать CountThreads*sizeof(DWORD). ps ты про конструкцию do { ... } while слышал?
Страшно ее не люблю Есть причины, хотя эта конструкция очень удобна. Я вот думаю, то что я выше применяю и это: http://www.codeproject.com/system/ntenumthreads.asp?print=true что будет лучше? Просто у меня Семантик Авер, на одну прогу выводящая листинг процессов, потоков и т.д. жалуется, а вот на Ms-Remовскую тулзу по убийству скрытых нет!
EvilsInterrupt Это я к тому, что нужно использовать все возможности технологии/языка, а не сидеть в уголке с десятком избранных конструкций.
EvilsInterrupt что будет лучше? Что значить _лучше_? Статья по ссылке применима для Win NT 4 где не было ToolHelp32 library. Если тебе нужна совместимость придется использовать оба варианта.