Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 215

/ вопрос решён /

Короче задача такая:
1. Перебрать все системные процессы. Это можно сделать так:

procedure CreateWinNTProcessList(List: TstringList);    
var    
  PIDArray: array [0..1023] of DWORD;    
  cb: DWORD;    
  I: Integer;    
  ProcCount: Integer;    
  hMod: HMODULE;    
  hProcess: THandle;    
  ModuleName: array [0..300] of Char;    
begin    
  if List = nil then Exit;    
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);    
  ProcCount := cb div SizeOf(DWORD);    
  for I := 0 to ProcCount - 1 do    
  begin    
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or    
      PROCESS_VM_READ,    
      False,    
      PIDArray[I]);    
    if (hProcess <> 0) then    
    begin    
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);    
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));    
      List.Add(ModuleName);    
      CloseHandle(hProcess);    
    end;    
  end;    
end;
2. Перебрать с первого по последний процесс и посмотреть, у какого какие длл-ки запущены.
Вот функция для определения всех выгруженных длл !!!В СИСТЕМЕ!!!:
unit ModuleProcs;    
 
interface    
 
uses Windows, Classes;    
 
type    
  TModuleArray = array[0..400] of HMODULE;    
  TModuleOption = (moRemovePath, moIncludeHandle);    
  TModuleOptions = set of TModuleOption;    
 
function GetLoadedDLLList(sl: TStrings;    
  Options: TModuleOptions = [moRemovePath]): Boolean;    
 
implementation    
 
uses SysUtils;    
 
function GetLoadedDLLList(sl: TStrings;    
  Options: TModuleOptions = [moRemovePath]): Boolean;    
type    
EnumModType = function (hProcess: Longint; lphModule: TModuleArray;    
  cb: DWord; var lpcbNeeded: Longint): Boolean; stdcall;    
var    
  psapilib: HModule;    
  EnumProc: Pointer;    
  ma: TModuleArray;    
  I: Longint;    
  FileName: array[0..MAX_PATH] of Char;    
  S: string;    
begin    
  Result := False;    
 
  (* Данная функция запускается только для Widnows NT *)    
  if Win32Platform <> VER_PLATFORM_WIN32_NT then    
    Exit;    
 
  psapilib := LoadLibrary('psapi.dll');    
  if psapilib = 0 then    
    Exit;    
  try    
    EnumProc := GetProcAddress(psapilib, 'EnumProcessModules');    
    if not Assigned(EnumProc) then    
      Exit;    
    sl.Clear;    
    FillChar(ma, SizeOF(TModuleArray), 0);    
    if EnumModType(EnumProc)(GetCurrentProcess, ma, 400, I) then    
    begin    
      for I := 0 to 400 do    
        if ma[i] <> 0 then    
        begin    
          FillChar(FileName, MAX_PATH, 0);    
          GetModuleFileName(ma[i], FileName, MAX_PATH);    
          if CompareText(ExtractFileExt(FileName), '.dll') = 0 then    
          begin    
            S := FileName;    
            if moRemovePath in Options then    
              S := ExtractFileName(S);    
            if moIncludeHandle in Options then    
              sl.AddObject(S, TObject(ma[I]))    
            else    
              sl.Add(S);    
          end;    
        end;    
    end;    
    Result := True;    
  finally    
    FreeLibrary(psapilib);    
  end;    
end;    
 
end.
3.Посмотреть, если у какого-то приложения запущена dll с именем DLLName, то узнать имя этого процесса (имя exe) и убить этот процесс.
Функция для убивания процесса по имени exe:
uses    
  Tlhelp32, Windows, SysUtils;    
 
function KillTask(ExeFileName: string): integer;    
const    
  PROCESS_TERMINATE=$0001;    
var    
  ContinueLoop: BOOL;    
  FSnapshotHandle: THandle;    
  FProcessEntry32: TProcessEntry32;    
begin    
  result := 0;    
 
  FSnapshotHandle := CreateToolhelp32Snapshot    
                     (TH32CS_SNAPPROCESS, 0);    
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);    
  ContinueLoop := Process32First(FSnapshotHandle,    
                                 FProcessEntry32);    
 
  while integer(ContinueLoop) <> 0 do    
  begin    
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =    
         UpperCase(ExeFileName))    
     or (UpperCase(FProcessEntry32.szExeFile) =    
         UpperCase(ExeFileName))) then    
      Result := Integer(TerminateProcess(OpenProcess(    
                        PROCESS_TERMINATE, BOOL(0),    
                        FProcessEntry32.th32ProcessID), 0));    
    ContinueLoop := Process32Next(FSnapshotHandle,    
                                  FProcessEntry32);    
  end;    
 
  CloseHandle(FSnapshotHandle);    
end;

КАК ЭТО ВСЁ СКЛЕПАТЬ ВМЕСТЕ И ЗАСТАВИТЬ РАБОТАТЬ???
P.S. с апи работаю недолго поэтому и прошу помощи.

BigNik Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: BigNik (статус: 1-ый класс)
Вопрос отправлен: 19 апреля 2011, 20:37
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Надо всё запихать в один модуль (не обязательно). Затем создать 2 TStringList. Первый скормить процедуре CreateWinNTProcessList(). Затем организовать цикл по его содержимому, скармливая в каждую итерацию 2й TStringList функции GetLoadedDLLList(). Во 2-м списке будут имена DLL-ок. Далее, с помощью метода TStrings.IndexOf() узнавать, есть ли в списке нужная DLL, и если есть, убивать процесс из 1-го TStringList функцией KillTask().

Ну, вот, типа как-то так.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 апреля 2011, 20:50
Оценка за ответ: 4

Комментарий к оценке: Спасибо за ответ! Я себе где-то так и представлял, но функция GetLoadedDLLList() получает инфу о длл выгруженых во всей системе, я так понял. (по описанию функции, она должна находить длл, выгруженные моей программой, но, после испытания функции было очень много выгруженных длл. Например, был длл с именем GameModue.dll. Уж моя то программа его то и не использует это точно.) Поэтому кто-нибудь может мне пожалуйста указать где в этой функции исатся длл в системе что бы я мог поменять на хендл нужного процесса? В итоге вызов функции должен получится как-то так: GetLoadedDLLList (Handle: THandle; List: TStringsList); где Handle - это хендл того процесса, у которого я хочу поискать длл.

Мини-форум вопроса

Всего сообщений: 34; последнее сообщение — 28 апреля 2011, 17:58; участников в обсуждении: 5.

Страницы: [« Предыдущая] [1] [2]

BigNik

BigNik (статус: 1-ый класс), 20 апреля 2011, 21:13 [#21]:

Блин одни создают через
(ComponentName).Create
другие через
(ComponentName):=T(ComponentType).Create
так что ж всё таки правильнее а?
min@y™

min@y™ (статус: Доктор наук), 20 апреля 2011, 21:16 [#22]:

Кури учебники. Там примеры есть.
Я пас. Надоело.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
BigNik

BigNik (статус: 1-ый класс), 20 апреля 2011, 21:21 [#23]:

да я как бы тоже...
Егор

Егор (статус: 10-ый класс), 20 апреля 2011, 21:23 [#24]:

Цитата (BigNik):

так что ж всё таки правильнее а?

в данном случае - без разницы.
был бы это с++, объяснил бы :) а в дельфях терминологией владею слабо.
в с++ подобные вещи (конструктор create) называются "статические методы". эти методы не привязаны ни к одному объекту и существуют как бы сами по себе. поэтому доступ к ним можно получить как через имя объекта (даже если объект ещё не проинициализирован), так и по имени класса.

важно! могу наврать. :) ибо в дельфях разбираюсь слабо.
чтобы узнать более подробно - почитай инфу по теме создания объектов в дельфи.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
BigNik

BigNik (статус: 1-ый класс), 20 апреля 2011, 21:27 [#25]:

у меня оба метода роботают нормально со всеми компонентами ( ну которые я перепробовал) но всё же спасибо!
bugmenot

bugmenot (статус: 3-ий класс), 21 апреля 2011, 13:19 [#26]:

Цитата:

Немного не понял последнего сообщения...

Слепить эту копипасту в нечто работоспособное будет сложнее, чем написать заново.
виконання програми розпочинається з того самого мiсця, де призупинилося.

Вадим К

Вадим К (статус: Академик), 21 апреля 2011, 13:41 [#27]:

правильно - (ComponentName):=T(ComponentType).Create
(ComponentName).Create - это неверно. Если у Вас "работает", покажите код того, что работает:)
Галочка "подтверждения прочтения" - вселенское зло.
BigNik

BigNik (статус: 1-ый класс), 21 апреля 2011, 16:39 [#28]:

bugmenot, может вы и правы... ладно напишу свою... если получится - тут выложу, если нет - буду "курить учебники" =)

насчёт (ComponentName).Create - да, оно например с TForm не работает... вы правы... как то я этого раньше не замечал...
Вадим К

Вадим К (статус: Академик), 21 апреля 2011, 16:45 [#29]:

покажите код, как используете (ComponentName).Create (пытаетесь)
Галочка "подтверждения прочтения" - вселенское зло.
BigNik

BigNik (статус: 1-ый класс), 21 апреля 2011, 16:54 [#30]:

как то странно... (ComponentName).Create не работает, но я вот точно помню (на 150%) что я где то когда то видел такое, но не помню где и когда... на форуме на каком то что ли?

Но всё же оно у меня не пашет.
Вадим К

Вадим К (статус: Академик), 21 апреля 2011, 17:12 [#31]:

Может быть просто тип был объявлен без буквы T в начале (она там в принципе не обязательна, это просто дань традиции).
Галочка "подтверждения прочтения" - вселенское зло.
BigNik

BigNik (статус: 1-ый класс), 21 апреля 2011, 17:16 [#32]:

ну может быть =)
BigNik

BigNik (статус: 1-ый класс), 26 апреля 2011, 21:24 [#33]:

ну вот после пыхтения с примерами у меня наконец то что-то получилось... но оно всё равно не работает так как надо...
вот сам проэкт : http://narod.yandex.ru/disk/11206908001/111.rar

но вот что я не пойму никак:
function CheckForDLLInProcess (ProcId : Cardinal; DLLName : string) : boolean;
var
 H: THandle;
 pe: TModuleEntry32;
 B: Boolean;
 R: Integer;
begin
 H:= CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcId); // <------------------
  try
    pe.dwSize:= SizeOf(pe);
    B:= Module32First(H, pe);
    while B do
    begin
      //ShowMessage (pe.szModule);
      if DLLName=StrPas(pe.szModule) then ShowMessage('FOUND!');
      B:= Module32Next(H, pe);
      if B then
    end;
  finally
    CloseHandle(H);
  end;
end;
Эта функция (CreateToolhelp32Snapshot), какой бы ни был параметр флага поиска, всё равно даёт все длл системы а не указанного в ProcId процесса... кто может помочь?
BigNik

BigNik (статус: 1-ый класс), 28 апреля 2011, 17:58 [#34]:

Спасибо всем ВОПРОС РЕШЁН

28 апреля 2011, 18:00: Статус вопроса изменён на решённый (изменил автор вопроса — BigNik)

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 23:38
Выполнено за 0.04 сек.