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)
-   -   Conocer Nombre y Ruta de una dll (https://www.clubdelphi.com/foros/showthread.php?t=60958)

escafandra 20-10-2008 21:05:55

Conocer Nombre y Ruta de una dll
 
Un proceso puede conocer su nombre de varias formas. GetModuleFileName nos dá la ruta completa y nombre del proceso en curso, incluso si se ejecuta desde una dll. Pero ¿Como sabe una dll su propio nombre y la ruta donde está?

Saludos y gracias.

droguerman 20-10-2008 22:10:17

Puedes usar EnumProcessModules para recuperar la lista de modulos cargados dentro de un proceso combinadola con GetModuleFileName.

saludos

escafandra 21-10-2008 12:56:39

Muchas gracias droguerman por tu interés y tu rápida respuesta. La idea que propones es interesante pero me pregunto si existe una forma más directa. Es decir, EnumProcessModules proporciona la lista de dll cargadas, a una dll concreta no le interesan las demás para conocer su nombre y ruta. Claro que es posible que el S.O. (sus APIs) no nos proporcione un método más directo....

Dicho de otra forma, ¿es posible conocer el hModule de una dll sin necesidad de enumerarlas todas?.


Muchas gracias. Saludos.

escafandra 21-10-2008 14:06:50

...Bueno, pues si que es posible. El hModule de nuestra dll es la HINSTANCE con la que se carga... Publico la forma como lo he conseguido.

Código:

char* GetDllFileName(HINSTANCE hinst, char* Buffer, int SizeBuffer)
{
  HANDLE  hProcess;

  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, GetCurrentProcessId());
  if(hProcess)
    GetModuleFileNameEx(hProcess, hinst, Buffer, SizeBuffer-1);

  CloseHandle(hProcess);
}

Saludos y gracias droguerman por darme la pista.

cHackAll 21-10-2008 16:28:29

Solo por curiosidad escafndra; GetModuleFileName(hinst, Buffer, SizeBuffer-1); o talvez, aunque sea lo mismo; GetModuleFileName(GetModuleHandle(NULL), Buffer, MAX_PATH); :confused:

droguerman 21-10-2008 16:44:54

Las DLL tambien tienen un HInstance con el cual puedes obtener el nombre del modulo. Cuando creas una DLL usando C se crea una función llamada DLLMain, la cual tiene como parámetro la instancia. El problema es que no se cual es el equivalente en delphi de esta función o si se implementa o no

escafandra 21-10-2008 18:09:57

Si, tienes razón en parte cHackAll. GetModuleFileName(hinst, Buffer, SizeBuffer-1); funciona igual. Pero GetModuleFileName(GetModuleHandle(NULL), Buffer, MAX_PATH); me devuelve el nombre del proceso.exe y no el de la dll. Por eso descarté, en un principio ese método.

Estudiando la enumeración que me propuso droguerman y usando el debug descubrí que el hModule de la dll, que tanto buscaba, no era ni mas ni menos que la HINSTANCE de la dll y no me lo pensé mas, adapté el código que hice para la enumeración... Pero la solución más simple es, una vez más, la que propones:

Código:

GetModuleFileName(hinst, Buffer, SizeBuffer-1);
Cita:

Empezado por droguerman (Mensaje 321363)
Las DLL también tienen un HInstance ...

Efectivamente, es esa HInstance la que uso para conocer el nombre de la dll.

Saludos y Gracias.


La franja horaria es GMT +2. Ahora son las 11:31:55.

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