Друзья! Короче, ситуация такая. Запуская программу main.exe, Она запрашивает имя процесса pr.exe, КОТОРОГО НЕТ После этого программа начинает в цикле этот процесс искать и искать его хэндл, пока не найдёт. Естественно, если процесса нет, то цикл повторяется. После этого я запускаю процесс pr.exe, программа main.exe находит хэндл и выходит из цикла Только уж очень большие хэндлы получаются! Смутно догадываюсь, что вызывать OpenProcess в цикле как-то не того... А хэндл ищу так: в цикле вызывается функция, которая делает снимок системы просматривает все процесссы сравнивая их названия с введённым Вот код, для простоты многое опустил (получение привилегий отладчиков и прочая) Код (Text): #include <stdio.h> #include <Windows.h> #include <Winnt.h> #include <tlhelp32.h> using namespace std; //Прототип той самой функции которая делает снимок системы и ищет хэндл HANDLE HandleProcessa (char* szFilename); int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); char ima_processa [MAX_PATH]; printf ("введи имя процесса\n"); gets (ima_processa); //Так, ищем хэндл процесса. Вот этот цикл. о котором я говорил HANDLE h= 0; while (!h) { h= HandleProcessa (ima_processa); printf ("h= %d\n", h); if (!h) CloseHandle (h); } printf ("h= %d\n", h); getchar(); return 0; } HANDLE HandleProcessa (char* szFilename) { HANDLE hProcessSnap; PROCESSENTRY32 pe32; //Это мы находим дескриптор снимка процессов hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) return false; pe32.dwSize = sizeof(PROCESSENTRY32); do { if (!Process32Next(hProcessSnap, &pe32)) // перечисляем процессы return FALSE; } while (lstrcmpi(pe32.szExeFile, szFilename)); // ищем нужный процесс. Его PID будет в поле pe32.th32ProcessID CloseHandle(hProcessSnap); //А вот тут возвращаем хэнл. Вот я не знаю, если хэндл нулевой, надо ли его закрывать и если на //до, то где? Я делаю это в вызывающей функции main return OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, pe32.th32ProcessID); }; В принципе, можно так решить проблему: в цикле не вызывать OpenProcess, а в цикле просто смотреть, существует нужный процесс в системе или нет. Если процесс нашёлся (я го запустил), то выходим из цикла и благополучно ВНЕ цикла вызываем OpenProcess ...Но хочется узнать почему не получается представленным способом.
Что конкретно не получается? Что значит "очень большие хэндлы получаются"? А какие они должны быть? OpenProcess в цикле вызывать не надо. Нулевые хендлы закрывать не надо.
Большие это порядка нескольких тыщ А вообще я решил проблему, дело в том, что всякий раз, сделав снимок системы и не найдя нужного процесса, возвращалось FALSE, но дескриптор снимка системы НЕ ЗАКРЫВАЛСЯ! Код (Text): do { if (!Process32Next(hProcessSnap, &pe32)) // перечисляем процессы return FALSE; } while (lstrcmpi(pe32.szExeFile, szFilename)); // ищем нужный процесс. Его PID будет в поле pe32.th32ProcessID CloseHandle(hProcessSnap); Изменил на: Код (Text): do { if (!Process32Next(hProcessSnap, &pe32)) { // перечисляем процессы CloseHandle(hProcessSnap); return FALSE; } } while (lstrcmpi(pe32.szExeFile, szFilename)); // ищем нужный процесс. Его PID будет в поле pe32.th32ProcessID CloseHandle(hProcessSnap); и всё заработало, аккуратненькие хэндлы получаются порядка 80-ти. Да они и раньше были рабочими, но у меня было много-много незакрытых хэндлов системы, что, конечно, плохо.