
	================================================
		Qu es una DLL y para qu sirve? 
			cmo se crea?

		      Por  n u M I T_o r
	================================================ 

DLL es la extensin de archivos empleados por Window$ para enlace dinmico. DLL es la abreviatura de Dinamic Link Library, que significa librera de enlace dinmico.

Un archivo DLL est compuesto por un conjunto de funciones y rutinas que pueden ser empleadas y llamadas desde un archivo ejecutable .EXE o desde cualquier otra .DLL. El uso de estas funciones se llama enlace dinmico porque se trata de un "enlace" semejante al realizado cuando enlazamos archivos .OBJ y .RES con el enlazador (linker) para crear ejecutables .EXE, pero que ocurre en tiempo de ejecucin y sin el uso de enlazador.

Esto fue implementado por Window$ considerando que muchas rutinas empleadas por varios programas eran las mismas. Para evitar perdida de espacio de memoria, Window$ rene esas rutinas comunes en archivos DLL que pueden ser accedidas, una vez cargadas en el rea de memoria compartida de un proceso, por ms de un programa o proceso.

Pero las DLL no slo ahorran espacio de memoria til. Tambin ofrecen otras ventajas. Cmo se encuentran en un rea de memoria compartida del proceso, son una va de acceso a proyectos remotos. Es algo complejo, pero se puede hacer. Adems de esto, las DLL permiten agregar cdigo a un programa sin tener que cambiar el ejecutable para nada: se podra hacer actualizaciones importantes de programas slo cambiando una DLL.

 

------------------------
Cmo escribir una DLL?
------------------------

Toda DLL tiene un punto de entrada el cual ser llamado por Win cada vez que 

- la DLL sea cargada 
- la DLL sea descargada 
- un hilo sea creado en el mismo proceso 

Este es un ejemplo del cdigo del punto de entrada de una DLL: 

DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
        mov  eax,TRUE
        ret DllEntry Endp 

El punto de entrada puede tener cualquier nombre y apunta a una funcin con tres parmetros: 

 hInstDll = manejador de instancia del mdulo DLL. 

 reason = bandera con uno los siguientes valores:

DLL_PROCESS_ATTACH: La DLL recibe este valor cuando injertado por vez primera en el espacio de direcciones del proceso. Se puede usar esta posibilidad para hacer inicializacin. 

DLL_PROCESS_DETACH: La DLL recibe este valor cuando est siendo descargada del espacio de direcciones del proceso. Se puede usar esta posibilidad para hacer una limpieza como deslocalizacin de memoria. 

DLL_THREAD_ATTACH: La DLL recibe este valor cuando el proceso crea un nuevo hilo. 

DLL_THREAD_DETACH : La DLL recibe este valor cuando un hilo del proceso es destruido

Para que la DLL sea cargada dentro de un proceso, debe retornar TRUE en eax. En caso contrario, no ser cargada. 

Las funciones de la DLL pueden ser colocadas antes o despus de la entrada. Pero para que puedan ser llamadas desde otros programas, deben colocarse las siguientes lneas en el archivo DEF de definicin: 


LIBRARY   DLL_Name 
EXPORTS   Function_Name 

La directiva LIBRARY define el nombre del mdulo DLL. Debe sealarse con el nombre de archivo de la DLL. La directiva EXPORTS dice al enlazador (linker) cuales funciones de la DLL son exportadas, es decir, pueden ser llamadas desde otros programas. 

 
----------------------------------------
Cmo compilar y enlazar un archivo DLL?
----------------------------------------

Hay que indicar en los conmutadores del enlazador la opcin /DLL y /DEF:DEF_name:

link /DLL /SUBSYSTEM:WINDOWS /DEF:DEF_name /LIBPATH:c:\masm32\lib OBJ_name.obj

Los conmutadores del ensamblador son los mismos: 

/c /coff /Cp 

En el caso de Borland Turbo Assembler, en vez de /DLL, se coloca /Tpd: 

tlink32 /Tpd /aa /c /v $(OBJS),$(NAME),, $(IMPORT), $(DEF), $(NAME) 

Despus de enlazar el archivo objeto, se obtendr la DLL y un archivo .lib. Este archivo .lib es la librera de importacin que puede ser usada para enlazar programas que usan las funciones que est en la DLL. Para que un ejecutable EXE u otra DLL llame a funciones dentro de una DLL, debe proyectar primero la DLL en el espacio de direcciones del proceso que llama.



  
---------------------------------------------------------
Como cargar la DLL en el espacio de nombres del proceso?
---------------------------------------------------------

Hay dos maneras: 

1. Enlazado implcito: es el ms comn. Como hemos visto al crear aplicaciones W32, al enlazar un ejecutable debemos indicar un conjunto de archivos LIB al enlazador. Estos archivos LIB contienen una lista de las funciones de la DLL que pueden ser importadas desde otros archivos EXE o DLL. Cuando hacemos el enlace, el enlazador toma informacin de los archivos LIB correspondientes y la incrusta en el archivo EXE creado. Luego, cuando el sistema cargue el EXE, el cargador examinar el encabezado de este archivo y establecer las DLLs que debern ser cargadas en el espacio de direcciones del proceso para que se ejecute la aplicacin. El sistema buscar las DLLs requeridas en los directorios de sistema e intentar cargarlas. 


2. Enlazado explcito: llamando a LoadLibrary con el nombre de la DLL deseada. Si la funcin tiene xito, devuelve un manejador a la librera (DLL). Si no, retornar NULL: 

	push	offset LibName
	call	LoadLibrary
	mov	hLib,eax

El manejador devuelto se puede pasar a GetProcAddress o a cualquier otra librera que requiera este manejador como parmetro: 

	push	offset FunctionName
	push	hLib
	call	GetProcAddress 
	mov 	FunctionAddress, eax

Esta llamada devuelve la direccin de la funcin cuyo nombre ha sido pasado como segundo parmetro. De otra manera, retorna NULL. El valor devuelto ahora puede ser usado para llamar a la funcin deseada:

        call	FunctionAddress

Usada la librera DLL, se descarga con FreeLibrary:

	push	hLib
	call	FreeLibrary

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

n u M I T_o r
numit_or@subdimension.com
http:/members.nbci.com/numit_or/asm.html

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


 

