PDA

Ver la Versión Completa : Saber dlls cargadas


cecam
13-06-2007, 14:35:30
Hoooola!

Me estoy peleando con la api para ver si hay alguna forma de saber (en runtime) que dlls hay cargadas una vez ha arrancado la aplicacion?

Esto viene de que al hacer reports (QR) carga y descarga infinidad de veces varias dll, añadiendo lentitud al report . . . en cambio si las dlls ya estan cargadas (loadlibrary) hay una mejora brutal . . . el problema viene que con el debugger ya puedo ver que dlls carga y descarga en mi maquina, pero en la maquina cliente no se que dlls cargara y no son siempre las mismas (versiones diferentes de SO, impresoras, etc)...

La idea final es hacer una funcion que mire que dlls hay cargadas, cree un report, mire nuevamente las que hay, para detectar que dlls especificas usa esa maquina en concreto y asi dejarlas cargadas . . .

Saludos!!!

seoane
13-06-2007, 14:43:40
Creo que la función que buscas es: EnumProcessModules (http://msdn2.microsoft.com/en-us/library/ms682631.aspx) o puede que EnumProcessModulesEx (http://msdn2.microsoft.com/en-us/library/ms682633.aspx)

Aquí tienes un ejemplo en C de como se utiliza:
http://msdn2.microsoft.com/en-us/library/ms682621.aspx

seoane
13-06-2007, 14:56:29
Y por si tienes el C oxidado ;)


uses PsApi;

procedure EnumModules(List: TStringList);
var
hMods: array[0..1024] of HMODULE;
hProcess: THandle;
Needed: DWORD;
i: Integer;
ModName: Array[0..MAX_PATH] of Char;
begin
List.Clear;
hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
FALSE, GetCurrentProcessId);
if hProcess <> 0 then
begin
if EnumProcessModules(hProcess, @hMods, Sizeof(hMods), Needed) then
for i:= 0 to (Needed div Sizeof(HMODULE)) - 1 do
begin
FillChar(ModName,Sizeof(ModName),#0);
if GetModuleFileNameEx(hProcess, hMods[i], ModName, Sizeof(ModName) - 1) <> 0 then
List.Add(String(PChar(@ModName)));
end;
CloseHandle(hProcess);
end;
end;


Por ejemplo:

var
Lista: TStringList;
begin
Lista:= TStringList.Create;
try
EnumModules(Lista);
ShowMessage(Lista.Text);
finally
Lista.Free;
end;
end;

cecam
13-06-2007, 15:04:16
Muchas grácias!!!

Estaba llegando a la misma conclusión a partir de este ejemplo http://www.swissdelphicenter.ch/torry/showcode.php?id=616

Saludos!!