Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Вниз

Как получить список 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
10-1160635928
MaxBooster
2006-10-12 10:52
2009.10.18
Создание и вызов Delphi COM обектов из WSH


15-1250312595
Kostya
2009-08-15 09:03
2009.10.18
Параметры запуска программы


15-1250501563
ford
2009-08-17 13:32
2009.10.18
запись в реестр в ветку HKLM


2-1250782279
istok20
2009-08-20 19:31
2009.10.18
createservice вызывает падение rpc...


15-1250519268
Superheroy
2009-08-17 18:27
2009.10.18
Верстальщики = class(Программисты)..?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский