Форум: "Основная";
Текущий архив: 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