Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.18;
Скачать: CL | DM;

Вниз

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

 
Vlad Oshin ©   (2008-09-02 11:55) [0]

Не подскажете, как?
Вот нашел код: (мне нужно выгрузить некоторые 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


 
brother ©   (2008-09-02 11:57) [1]

> EnumModType

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


 
brother ©   (2008-09-02 11:58) [2]

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


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

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


 
Vlad Oshin ©   (2008-09-02 12:12) [4]

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


 
brother ©   (2008-09-02 12:12) [5]

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

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


 
{RASkov} ©   (2008-09-02 12:19) [6]

> как это?
> 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:20) [7]

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

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


 
{RASkov} ©   (2008-09-02 12:23) [8]

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

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


 
Vlad Oshin ©   (2008-09-02 12:56) [9]

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


 
Vlad Oshin ©   (2008-09-02 13:59) [10]

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


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;


 
Leonid Troyanovsky ©   (2008-09-02 15:36) [11]


> 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 17:27) [12]

Вот меня наверное гложет дурацкая идея..
Хочу выгружать 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 показывают - а там не очень понятно)

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


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


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

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


 
Vlad Oshin ©   (2008-09-02 17:52) [14]


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

да

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

(XP, D2006)



Страницы: 1 вся ветка

Текущий архив: 2009.10.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
2-1250492579
studenttgata
2009-08-17 11:02
2009.10.18
Определение градиента.


3-1228301781
tipman
2008-12-03 13:56
2009.10.18
Транзакция в dbase


2-1249906240
abun
2009-08-10 16:10
2009.10.18
Фильтрация массива чисел от шума


15-1250495822
D.L.
2009-08-17 11:57
2009.10.18
EurekaLog


2-1250586312
Рик
2009-08-18 13:05
2009.10.18
Проблема. Русская кодировка в некоторых функциях.