![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить список 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
это функция или что?