You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
codingGetConnectionselseGetExConnections;end;Функция AllocateAndGetTcpExTableFromStack документирована и очень подробно.Нужно только уметь искатьЗагрузка функцийМы объявили переменные, через которые будемобращаться к системным функциям, но всеони являются указателями и на данном этапеуказывают в никуда. Теперь в них необходимозаписать соответствующие адреса. В прошлыйраз для этого мы создавали функциюLoadAPIHelpAPI. Давай расширим ее и добавимследующие строки:@AllocateAndGetTcpExTableFromStack:=GetProcAddress (HIpHlpApi, 'AllocЛистинг 2function TForm1.ProcessPidToName(hProcess: THandle; ProcID: DWORD):String;varprocEntry: TPROCESSENTRY32;ProcessName: String;beginprocEntry.dwSize:=sizeof (procEntry);ProcessName:='???';if (Process32First (hProcess,procEntry)) then begin repeat/ / Если текущий процесс равен искомому,то возвращаем его имяif (procEntry. th32ProcessID =ProcId) then beginProcessName:=procEntry.szExeFile;Result:=ProcessName;exit; end;until (not Process32Next (hProcess,&procEntry));end;Result:=ProcessName;end;xàêåð 02 /98/ 07/ateAndGetTcpExTableFromStack');@AllocateAndGetUdpExTableFromStack:=GetProcAddress (HIpHlpApi, 'AllocateAndGetUdpExTableFromStack');@CreateToolhelp32Snapshot:=GetProcAddress (GetModuleHandle('kernel32.dll'), 'CreateToolhelp32Snapshot');@Process32First:= GetProcAddress(GetModuleHandle ('kernel32.dll'),'Process32First');@Process32Next:= GetProcAddress(GetModuleHandle ('kernel32.dll'),'Process32Next');Теперь, после загрузки, каждая переменнаяукажет на соответствующую функцию в системе.Если какая‐то функция не будет найдена, тосоответствующая переменная будет равна нулю.Эту особенность мы используем для того, чтобыопределить, поддерживает ли ОС новые функцииили необходимо применить универсальныйкод, который мы рассматривали в прошлый раз.РеализацияВот мы и подошли к самому интересному — реализацииуниверсального примера. В нашемстаром коде по событию OnShow вызываласьфункция GetConnections, в которой и происходилоопределение состояний портов. Улучшимпример, поставив условие вместо безусловноговызова:procedure TForm1.FormShow (Sender:TObject);beginif @AllocateAndGetTcpExTableFromStack=nil thenЕсли указатель AllocateAndGetTcpExTableFromStack равен нулю, значит, соответствующейфункции нет в системе и нужно вызыватьGetConnections.Если он не равен нулю, то функция найденав системе и можно использовать расширенныефункции, которые мы рассмотрелисегодня. Полный код содержится в функцииGetExConnections, которую мы поместилив листинге 1.Логика GetExConnections практически не изменилась,по сравнению с ранее написаннойGetConnections.Мы точно так же получаем таблицу состоянийи выводим ее содержимое, просто пользуясьпри этом другими API- функциями.Единственное, что заслуживает отдельноговнимания, — это вызов функцииProcessPidToName, которая должна переводитьидентификатор процесса в удобочитаемоеимя. Эту функцию с подробнейшими комментариямиты можешь увидеть в листинге 2.ИтогПрограмма готова. На DVD ты найдешь полноценнуюпрограммку, которая определяет портыи делает это универсально.Если система поддерживает расширенныефункции, то она использует их и отображаетимена процессов. Если нет, то ничего страшного,никакой ошибки не произойдет — прогапросто воспользуется старыми функциямии отобразит все то же самое, исключая имяпроцесса.Как видишь, все гениальное — в простотеи умении искать нужные функции. Можешьулучшить этот пример, чтобы он обновлялтаблицу по таймеру и подсвечивал записи,состояние портов которых изменилось, илиновые записи в таблице. Можно добавитьвозможность уничтожения выделенногопроцесса, ведь соответствующий идентификатормы научились определять. Тольконе забывай, что при использовании старыхфункций процесс не определен. Кстати, написанныйпример получает только состояниеIP-портов старой версии, а реализациюсостояния IPv6 легко организовать простымизменением последнего флага при вызовефункций AllocateAndGetTcpExTableFromStackи AllocateAndGetUdpExTableFromStack.На этом спешу откланяться. До новых встреч! z125