Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Saber dlls cargadas (https://www.clubdelphi.com/foros/showthread.php?t=44718)

cecam 13-06-2007 14:35:30

Saber dlls cargadas
 
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 o puede que EnumProcessModulesEx

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 ;)

Código Delphi [-]
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:
Código Delphi [-]
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

Que maquina!!!
 
Muchas grácias!!!

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

Saludos!!


La franja horaria es GMT +2. Ahora son las 12:47:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi