Ну, то есть читаю иной раз, Например, здесь http://progeru.narod.ru/article/cpp_proc.html что для того, чтобы сделать снимок всех процессов, надо определить первый процесс с помощью API- функции Process32First Но зачем? Вот код,который пробегается по всем процессам и для каждого заполняет структуру PROCESSENTRY32 безо всякой функции Process32First Код (Text): #include <stdio.h> #include <Windows.h> #include <Winnt.h> //Здесь определена структура PROCESSENTRY32 и функция CreateToolhelp32Snapshot #include <tlhelp32.h> HANDLE functsia () { HANDLE hProcessSnap; PROCESSENTRY32 pe32; //Это мы находим дескриптор снимка процессов hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) return false; pe32.dwSize = sizeof(PROCESSENTRY32); //эТО ЕСЛИ В ФАЙЛ захочется вывод перенаправить... // FILE *f; // f = fopen("rezultat.cc","wb"); while (Process32Next(hProcessSnap, &pe32)) { printf ("pe32.dwSize= %x\n", pe32.dwSize); printf ("pe32.cntUsage= %x\n", pe32.cntUsage); printf ("pe32.th32ProcessID= %x\n", pe32.th32ProcessID); printf ("pe32.th32DefaultHeapID= %x\n", pe32.th32DefaultHeapID); printf ("pe32.th32ModuleID= %x\n", pe32.th32ModuleID); printf ("pe32.cntThreads= %x\n", pe32.cntThreads); printf ("pe32.th32ParentProcessID= %x\n", pe32.th32ParentProcessID); printf ("pe32.pcPriClassBase= %x\n", pe32.pcPriClassBase); printf ("pe32.dwFlags= %x\n", pe32.dwFlags); printf ("pe32.szExeFile= %s\n\n", pe32.szExeFile); } //fclose (f); CloseHandle(hProcessSnap); } int main () { functsia (); getchar (); return 0; } Но, возможно это частный случай, а вообще Process32First, наверное очень полезна. Наверное, я это осознаю, если пойму каклой процесс СЧИТАЕТСЯ первым (а я вижу по крайней мере 2 кандидатуры- это текущий и САМЫЙ ГЛАВНЫЙ, не знаю, как он называется) Хотелось бы всё же узнать, что значит первый процесс? И откуда идёт э... отсчёт? И если это САМЫЙ ГЛАВНЫЙ процесс, зачем нам его определять, если он первый по умолчанию? Просьба к официальной документации не отсылать, ибо я там был и вот что прочёл: Retrieves information about the first process encountered in a system snapshot. Безо всяких объяснений.
Первым процесс для Process32First считается процесс, который отображается первым в снапшоте. А он может быть любым (никто не гарантирует нам, что первый процесс в снапшоте будет текущим процессом, "главным процессом", или будет иметь какие другие признаки и свойства). В общем понятие это применимо в данном контексте применимо только к этой системе API, и не выходит за её рамки.
И всё? Стоило было огород городить, создавать специальную функцию Process32First... Лишние движения какие-то... А что, с потоками то же самое получается? Вот здесь в седьмой главе http://wm-help.net/books-online/book/59464/59464-26.html Джефри Рихтер рассказывает, как приостановить все потоки какого-нибудь процесса. И опять использует Thread32First Смысл? Какая разница, какой поток определять первым, если всё равно пробегаться ПО ВСЕМ ПОТОКАМ? Как-то непрактично. Или я не понимаю чего-то.
Хорошо. Я понял, что Process32First, нужна, чтобы заполнить структуру PROCESSENTRY32 для первого процесса в снимке. Более того, я понял, что она не определяет первый процесс, а просто заполняет структуру. Но вот кто бы ещё сказал, почему без этой функции можно обойтись в моём коде, где непонятно, с какого процесса начинать заполнение структуры! Но работает ведь... А я вот щас пробежался по ссылкам- все ребята в похожих кодах эту функцию используют... Странно, очень странно. Спасибо.
Основная польза от Process32First это при поиске Идентификатора Процесса (PID'а) прерваться на первой итерации иначе, возможно что искомый PID является первым в снимке и не имеет смысла продолжать поиск далее Код (Text): invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0 mov hSnapshot, eax .if eax == INVALID_HANDLE_VALUE mov eax, INVALID_HANDLE_VALUE retn .endif mov lppe.dwSize, sizeof lppe invoke Process32First, hSnapshot, addr lppe .if eax invoke lstrcmpi, addr lppe.szExeFile, szProcName .if eax==0 mov dwPID, lppe.th32ProcessID invoke CloseHandle, hSnapshot ret .endif .endif В первом снимке память (первая итерация вызов Process32First) Код (Text): 0012FB64 68 FB 12 00 28 01 00 00 00 00 00 00 00 00 00 00 hы.(.......... 0012FB74 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ............... 0012FB84 00 00 00 00 00 00 00 00 5B 53 79 73 74 65 6D 20 ........[System 0012FB94 50 72 6F 63 65 73 73 5D Process] [System Process] - это первый процесс (PID=0)
Ребята, тут что-то не то. Coderess, не то что-то. Ну, посуди сам. Вызовем мы Process32First или не вызовем- ничего не изменится. Первым как был System Process, так они останется. Все сравнения можно отлично выполнить в цикле. То есть фактически, System Process нужна, чтобы получить структурку одного единственного процесса Process32First?! Ну, я же говорю- стоило огород городить, для этого писать целую API функцию... ...Назвали бы уж её сразу Process32SystemProcess... Не, ну а как, если первый процесс ВСЕГДА System Process? dynВызывал два раза, ничего не менялось. И первый раз все структуры нормально выводились и второй, я проверял. Вот так вызывал Код (Text): int main () { functsia (); getchar (); functsia (); getchar (); return 0; }
amvoz dyn написал причину верно. Это сделано, чтобы можно было в любой момент вернуть объект в исходное состояние и начать с ним работать заново. Создавать объект повторно может быть накладно.
dyn никакой причины не называл. ... Я думал, что первый раз у меня всё выведется, а второй- нет (без Process32First) Так оно и второй раз всё вывелось корректно. И третий и четвёртый. ...А как с помощью Process32First я верну объект в исходное состояние? И о каком объекте речь?
Я их не изучал ещё и не надо меня подкалывать. Короче, никто не знает, зачем нужен Process32First. Вернее, так. На этот-то вопрос отвечают уверенно- он заполняет структуру первого процесса. Но смысл этого действия никто объяснить не может. Действительно, если первый процесс SYSTEM PROCESS (по крайней мере, у меня так), тогда придётся согласиться с нелепостью существования Process32First- это ж надо, ради одного единственного процесса целую функцию писать при том, что и без неё всё отлично можно получить. Если первый процесс ЛЮБОЙ, то всё ещё смешнее. Process32First заполняет структуру ПЕРВОГО ПОПАВШЕГОСЯ процесса. Нет слов. И ведь никто не задумывался над этим. Просто сдували друг у друга коды и вставляли в собственные статьи. ...Хотел было переспросить, откуда его считать первым- слева, справа, с адреса такого-то, со времени существования, но вспомнив ответ n0name- что он первый СЛУЧАЙНО (с которым все согласны), передумал.
Да мне-то что? Не можете ответить- не надо. Я для себя пометил на бумажке, что представляет Process32First и всё. А вы дальше её используйте.
Например в системе 100 процесов, ты начал перечислять их и на 20 передумал и перестал это делать (например из-за сбоя в программе). Если теперь ты снова решишь их перечислить, то без Process32First перечислятся оствшиеся 80, а 20 ранее перечисленных останутся "за кадром". Использование Process32First гарантирует что всегда перечислятся все процессы. Объект - снимок системы на основе которого ты и перечисляешь.
Ну да. Так-то всё понятно. Только, наверное, приостановка не из-за сбоя программы, да? Cбой программы- это авария. Но не берусь спорить, может существуют способы как-то продолжать прогу, не знаю. А вот так понятно: Схема: Перечисляем первые 20 процессов из 100 (в цикле со счётчиком) Потом делаем некоторые действия (хэндл снимка системы не закрываем) Начинаем перечислять процессы сначала (И вот тут нужна Process32First) Понятно, что. Просто сами понимаете, Process32First нужно использовать там, где её НУЖНО использовать. В других случаях- не знаю. Хотя, это, наверное, правило хорошего тона в программировании. Спасибо, тему закрыть можно.
Да почитай про SEH и VEH, с их помощью как раз возможна ситуация, когда обработчик исключения откатит программу в состояние когда снимок уже сделан, а перечисление не завершено.