Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить список dll, которые использует мое приложение?


Vlad Oshin ©   (2008-09-02 11:55:00) 

Не подскажете, как?
Вот нашел код: (мне нужно выгрузить некоторые dll)

type
 TModuleArray = array [0..400] of HMODULE;

// var
//  i:integer;

function GetLoadedDLLList: Boolean;
type
 EnumModType = function (hProcess: Longint; lphModule: TModuleArray;
 cb: cardinal; 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;
 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;
   FillChar(ma, SizeOF(TModuleArray), 0);
   if EnumModType(EnumProc)(GetCurrentProcess, ma, 400, I) then // error: Range check error
   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;
           S := ExtractFileName(S);
           WriteToLog(S);
           if pos('NQ',S)=1 then begin
                                   WriteToLog('Try free '+S);
                                   FreeLibrary(ma[i]);
                                 end;
.......

Вот там вылетает,
но .. даже синтаксиса вызова не понимаю..
как это?
if fun1(arg1)(arg2) then


Vlad Oshin   (2008-09-02 17:52:00) [1]


> И у тебя такая строка проходит?

да

..куда она с подводной лодки..

(XP, D2006)


Германн   (2008-09-02 17:45:00) [2]


>  Application.Title := 'NumeroQuattro.Департамент';

И у тебя такая строка проходит?


Vlad Oshin   (2008-09-02 17:27:00) [3]

Вот меня наверное гложет дурацкая идея..
Хочу выгружать dll(плагины) сам.
Если выгружаю -  ошибки..(разные)
Если не выгружаю - ошибок нет. В dpr основной программы
   
   DeleteLog;
   WriteToLog('-= NumeroQuattro START =-');

   Application.Initialize;
   Application.Title := 'NumeroQuattro.Департамент';
   Application.CreateForm(TfrmMain, frmMain);
   Application.Run;

   //UnLoadAllModules; //и тут ошибка, все же нельзя выгружать dll
   WriteToLog('-= NumeroQuattro END =-');

Тогда лог примерно такого содержания

DateTime: 02.09.2008 17:08:27 -= NumeroQuattro START =-
DateTime: 02.09.2008 17:08:27 Try LoadLibrary NQUser
DateTime: 02.09.2008 17:08:27 NumeroQuattro.Департамент: module NQUser.dll attach process
DateTime: 02.09.2008 17:08:27 Try LoadLibrary NQDepartment
DateTime: 02.09.2008 17:08:27 NumeroQuattro.Департамент: module NQDepartment.dll attach process
...
DateTime: 02.09.2008 17:16:46 Send message NQM_QUIT to NQUser.dll
DateTime: 02.09.2008 17:16:46 -= NumeroQuattro END =-
DateTime: 02.09.2008 17:16:46 NumeroQuattro.Департамент: module NQBasket.dll detach process
DateTime: 02.09.2008 17:16:46 NumeroQuattro.Департамент: module NQProperty.dll detach process


стоит расскоментить
   //UnLoadAllModules; //и тут ошибка, все же нельзя выгружать dll
лог становится нормальным

DateTime: 02.09.2008 17:08:27 -= NumeroQuattro START =-
DateTime: 02.09.2008 17:08:27 Try LoadLibrary NQUser
...
DateTime: 02.09.2008 17:16:46 NumeroQuattro.Департамент: module NQDepartment.dll detach process
DateTime: 02.09.2008 17:16:46 NumeroQuattro.Департамент: module NQUser.dll detach process
DateTime: 02.09.2008 17:16:46 -= NumeroQuattro END =-

но ошибки в RTL, AV и проч.. (и фиг поймешь где, CPU показывают - а там не очень понятно)

в принципе, не должно волновать. Но не хорошо как-то, имхо.


Leonid Troyanovsky   (2008-09-02 15:36:00) [4]


> Vlad Oshin ©   (02.09.08 13:59) [10]

> Итого, как это работает для своего процесса

http://groups.google.com/group/borland.public.delphi.winapi/msg/567deb1a74f90df5

--
Regards, LVT.


Vlad Oshin   (2008-09-02 13:59:00) [5]

Итого, как это работает для своего процесса


Function GetAllProcesses2: Boolean;
Type
 TEnumProcessModules = Function (hProcess: THandle; lphModule: LPDWORD; cb: DWORD; Var lpcbNeeded: DWORD): BOOL Stdcall;
 TGetModuleFileNameExA = Function (hProcess: THandle; HMODULE: HMODULE; lpFileName: PAnsiChar; nSize: DWORD): DWORD Stdcall;
Var
 EnumProcessModules : TEnumProcessModules;
 GetModuleFileNameExA: TGetModuleFileNameExA;
 hPSAPI : THandle;
 Counter1 : LongWord;
 pbNeeded : DWORD;
 ModHndls : Array[0..1023] Of DWORD;
 mbNeeded : DWORD;
 ModulePath : String;
Begin
 Result := False;
 hPSAPI := LoadLibrary('PSAPI.dll');
 If hPSAPI < 32 Then
  Begin
    Result := False;
    Exit;
  End;
 EnumProcessModules := GetProcAddress(hPSAPI, 'EnumProcessModules');
 GetModuleFileNameExA := GetProcAddress(hPSAPI, 'GetModuleFileNameExA');
 If EnumProcessModules(GetCurrentProcess, @ModHndls, Length(ModHndls), mbNeeded)
  Then For Counter1 := 0 To (mbNeeded Div 4) - 1 Do
         Begin
           SetLength(ModulePath, MAX_PATH);
           GetModuleFileNameExA(GetCurrentProcess, ModHndls[Counter1], PChar(ModulePath), MAX_PATH);
           Form2.memo1.Lines.add(ModulePath);
         end;
 FreeLibrary(hPSAPI);
End;

procedure TForm2.Button1Click(Sender: TObject);
begin
  GetAllProcesses2;
end;


Vlad Oshin   (2008-09-02 12:56:00) [6]

а тут понятнее
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=7020


{RASkov}   (2008-09-02 12:23:00) [7]

> [7] Vlad Oshin ©   (02.09.08 12:20)

Точно.... Как же мы все привыкли к T :)


Vlad Oshin   (2008-09-02 12:20:00) [8]

так это же приведение типов, походу!

- ладно, если до вечера не выберусь - домой пойду, - сказал ежик, упавший в яму.


{RASkov}   (2008-09-02 12:19:00) [9]

> как это?
> if fun1(arg1)(arg2) then


> type
> EnumModType = function (hProcess: Longint; lphModule: TModuleArray;
>    cb: cardinal; var lpcbNeeded: Longint): Boolean; stdcall;

и

> if EnumModType(EnumProc)(GetCurrentProcess, ma, 400, I) then

Хм... мне тоже интересна сия реализация....
...куда зарыли собаку?

> [3] Vlad Oshin ©   (02.09.08 12:05)

Данный код разбросан по всему инету, я первый попавшися нашел, у меня он отработал верно(без явных ошибок).
Синтаксическая проверка показывает что ошибок в коде нет, кодекомплишен почемуто не работает....
Странно все это :)


Vlad Oshin   (2008-09-02 12:12:00) [10]

а она вообще не описана..
и куча сайтов копируют и копируют одно и тоже


brother   (2008-09-02 12:12:00) [11]

странное использование...

(GetCurrentProcess, ma, 400, I)
это понятно... остальное нет(


Vlad Oshin   (2008-09-02 12:05:00) [12]

а черт ее знает, вот тут
http://delphiworld.narod.ru/base/get_loaded_dll_list.html
нашел


brother   (2008-09-02 11:58:00) [13]

можно ее описание?


brother   (2008-09-02 11:57:00) [14]

> EnumModType

это функция или что?


Наверх

Титульная страница Поиск, карта сайта Написать письмо