Конференция "WinAPI" » Как получить список работающих на данный момент DLL от всех [D7, WinXP]
 
  • dreamse (11.02.08 17:56) [0]
    процессов. или от персонального процесса указанного в программе.

    Есть код позволяющий получить список dll которые используються в нашем приложении. А как получить список всех DLL которые активны на данный момент ?

    Код для получения списка DLL своего приложения


    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.


  • clickmaker © (11.02.08 18:07) [1]
    Process32First, Process32Next, ну и получать список DLL, загруженных каждым
  • dreamse (11.02.08 18:59) [2]
    > clickmaker ©   (11.02.08 18:07) [1]

    Это понятно :)

    Я только к сожалению не смог разобраться с вышеприведенным кодом, где там указывать путь или Id процесса ?

    GetCurrentProcess ?
  • clickmaker © (11.02.08 19:25) [3]

    >  [2] dreamse   (11.02.08 18:59)

    GetCurrentProcess -- это только для твоего.
    для чужих нужно OpenProcess делать
 
Конференция "WinAPI" » Как получить список работающих на данный момент DLL от всех [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.002]