Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-10-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #2  
Antiguo 20-10-2008
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
Puedes usar EnumProcessModules para recuperar la lista de modulos cargados dentro de un proceso combinadola con GetModuleFileName.

saludos
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 21-10-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 21-10-2008 a las 13:29:12.
Responder Con Cita
  #4  
Antiguo 21-10-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
...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.
Responder Con Cita
  #5  
Antiguo 21-10-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Solo por curiosidad escafndra; GetModuleFileName(hinst, Buffer, SizeBuffer-1); o talvez, aunque sea lo mismo; GetModuleFileName(GetModuleHandle(NULL), Buffer, MAX_PATH);
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #6  
Antiguo 21-10-2008
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
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
__________________
self.free;
Responder Con Cita
  #7  
Antiguo 21-10-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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 Ver Mensaje
Las DLL también tienen un HInstance ...
Efectivamente, es esa HInstance la que uso para conocer el nombre de la dll.

Saludos y Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
"nombre de archivo inválido" Error cuando la ruta es muy larga. JuanErasmo Windows 6 21-04-2008 15:36:45
Conocer el nombre del servidor Pablo Carlos Redes 4 07-03-2005 23:08:10
Conocer PrinterIndex a partir del nombre Novás Varios 1 16-07-2004 18:26:14
Ruta y nombre de archivo INI jfranco Varios 2 27-02-2004 16:44:23
Conocer el nombre de la aplicacion que se encuentra activa cso2000 Varios 4 24-10-2003 02:28:14


La franja horaria es GMT +2. Ahora son las 20:19:44.


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