Está en la página 1de 13

c 

 
      

by Ron Petrusha
04/26/2005

c     
                       

  
       
    
                          
     
  
     c  c   c                  

                        
   
         
 !                 
  "          
      # $
   
    %           &   #        
   
                # 
                          '
  
                 

#      ( (  
     
      
  )   "     #         
             * +        %!,,&

c             !,, * + 
                -.-      
!,,  /. -                     
  
    -                 
   !,, * +    


     

 na librería de enlace dinámico (DLL) es una biblioteca de funciones y procedimientos que se puede
llamar desde una aplicación o archivo DLL otro.  so de una biblioteca de esta forma tiene dos
funciones principales:

* Permite el intercambio de código. El mismo archivo DLL puede ser utilizada por muchos otros
archivos DLL y las aplicaciones. La API de Win32, por ejemplo, se implementa como una serie de
archivos DLL de Windows. Por otra parte, siempre y cuando varios procesos de carga de la misma DLL
en la misma dirección base, pueden compartir el código en el archivo DLL. En otras palabras, una
única DLL en la memoria se puede acceder por varios procesos.
* Se permite el desarrollo basado en componentes y modular, lo que hace que el desarrollo y el
proceso de actualización sea más fácil.

Normalmente, cuando una biblioteca estática se utiliza en el desarrollo de aplicaciones, los módulos
de la biblioteca debe estar vinculada a la aplicación final. Con la vinculación dinámica, los módulos
pueden residir en un archivo independiente ͟͞DLL͟ que se carga de forma dinámica, ya sea cuando se
carga la aplicación o cuando sus funciones miembro son necesarios.

 na librería de enlace dinámico pueden incluir funciones internas, que sólo se puede llamar desde
dentro de la DLL. Su objetivo principal, sin embargo, es proporcionar funciones exportadas - es decir,
funciones que residen en un módulo de la DLL y se puede llamar desde otros archivos DLL y las
aplicaciones. Con frecuencia, una definición (. Def) del ar chivo se utiliza en C / C + + a la lista de las
exportaciones de un archivo DLL.
 n archivo DLL también incluye un punto de entrada opcional, que se llama cuando se carga un
proceso o subproceso o descarga el archivo DLL. Windows llama a este punto de en trada cuando se
carga un proceso y descarga el archivo DLL. También llama a la puerta de entrada cuando el proceso
crea o termina un hilo. Eso permite que el archivo DLL para realizar cualquiera por proceso y la
inicialización de cada aplicación y limpieza. La sintaxis de este punto de entrada, que debe utilizar la
convención de llamada estándar (usado por defecto en Visual Basic), es:

i   
  
     
    

los Parámetros son:

„ x es un long           !,,-      
!,,  

 una constante que indica por qué el punto de entrada ha sido llamado. Los valores
posibles son:

 



 n proceso se está cargando el archivo DLL. Cualquier inicialización por proceso se debe realizar.

 





El proceso está generando un nuevo hilo. Cualquier inicialización por hilo debe ser realizada.

 




 n hilo es la salida. Cualquier limpieza por hilo debe ser realizada.

 



 n proceso es extraer el archivo DLL, o el proceso está saliendo. Cualquier limpieza por proceso se
debe realizar.

 

Es un long que proporciona más información acerca de


i !""## $ %

i !""
!# $ que proporciona más información acerca de    

#$!
## $ 
#$!

!# $ .)

Si fdwReason es DLL_PROCESS_ATTACH, esto es nada para las bibliotecas cargadas dinámicamente


utilizando funciones como LoadLibrary y GetProcAddress, y no es nada para las bibliotecas de carga
estática por talones de la colección de proporcionar en tiempo de compilación. Si fdwReason es
DLL_PROCESS_DETACH, no es nada si la llamada es el resultado de una llamada a la función de Win32
FreeLibrary, y no es nada si el punto de entrada se llama durante la terminación del proceso.

-                +0 !,,1'02c-331/))/c43


          )        
 )
                  * +  
    
            * + /     
               * 56) )    
           * 56) '  

-                +0 !,,1'02c-331/))/c43
          )        
 )
                  * +  
    
            * + /     
               * 56) )    
           * 56) '  

El Código DLL

-         !,, * +       
    - 
   
   !,,     
    
%    & 7 ,8


 
 



 






 






 








 






  
  „ 



 












 

 


 




 

 


 



 




 






„
    
 


 





„

 


 


  


  
  









 
„
 


 




  


  
  









 
„
 


 





  


  
! 









 
„
 


!


"



  


     
   ,       
    !7  
"             / 
!7      )         
     +0   
!,,1'02c-331/))/c4

-  

         !,, * +       
   '
                   

 /'9 * 56      !,,          
             '            
                          
   
          -        
                         3 

           c27      7 7  
          /'9* 56 /    
 
 
    * 56 /'9      

):     
       
    !,,  * +    
   '            -.-              
 
 -      
               !       
            !,,8


 
  
 
 
#„  #









 
  
 
 
#„  #









 
  
!
 
#„  #







-  
            !,,     ,:  


                   !,,

- 
           !,,8

 !&


'(

'(

') 

i " '
' *  
+(' 
'
',  +-&+-. "  
!" 

i " '(' *  
+(' 
'(',  +-&+-. "  
!" 

i " '")  *  
)+")  
'") ,  +-&+-. " ) 
!" 

i "  '   
+/
+/00
)+1
!" 

è   !" #  

Comencemos por crear un proyecto DLL ActiveX y ver lo que ocurre si tratamos de llamar como si
fuera una norma DLL de Windows. Al crear un proyecto DLL ActiveX, Visual Basic agrega
automáticamente un módulo de clase (un archivo. cls) a la misma. Puede cambiar el nombre si desea,
pero no incluye ningún código. En su lugar, agregue un módulo de código (un archivo. BAS) para el
proyecto, agregar el código del archivo DLL y, a continuación, compile la DLL. Al ejecutar la aplicación
de prueba DLL, el diálogo de mensaje de error que se muestra en la Figura 1 aparece. El mensaje de
error indica que, aunque se encontró el archivo DLL, la función específica llamada (incremento) no lo
era.

†
;-     !,, /.     !,, * + 

La causa más probable de este error es que la función no es exportadas por la DLL. Podemos utilizar
la utilidad D  PBIN para examinar las exportaciones de un archivo DLL mediante el uso de la sintaxis

'2   ' 3 4& 


Si corremos DumpBin utilizando esta sintaxis, podemos ver el siguiente resultado:
     %
'5 6,00,7889 
%     /::1 ;/::7,, 



' ' , 



#%<
 

"     &   , 

 0   
8/:!=1 '  '
/0/0<08<171008 
0,00  
 /    
 8 '    
 8 '  ' 

  5 ' 

 /00000/:1!
 > ?  
 1/0000/:01
@  A 
 B10000/:/7
" 
 8B0000/7! 
>" 

" '' %

/000,  
/000,  
/000, 
/000,& 

*        !,,                            


  c27 -             !7           
  '  < =                  !,, 
/.!,,            !,,
 * + 

-       
      c        " /   $> c
? >    "    !,, /.    
         
             !,,  /. '  
                              
 @     A                      
:        c6-.-  ,9* -.-             
  3        
 A         

      !,,       


"                     

 

'                           
          c6,9*   
       - 
      
          c6-.-
          ((     c6        
cj 8







i "    

!  '?& 


' '"i " 

' "?","%'A 

'#&" ' 

 '+ ''  

i + ,i 

"+ ",  #& i .- C1 ,&- 

,D-&   -.
.--.#'  
,D */ 
,D- ''   ' 1 <- 
,D--. ' 
,D */ 
,D-  1 '- 

"-1 ',&-. ' 
(!,? '230# 
,D-!   1 ',,,- 
!(

,D */ 
,D-  '1 ' - 
,  

!" 


El proceso de implantación de un archivo DLL ActiveX produce la siguiente salida en nuestro archivo
de registro:

&   /14/041008/1<88<11i 

''   ' 1 < 
;- <C
 > !E/C C "E/C#'C5199/0B- ;- <C5i A C
 C  , - ;DB;@%;@=;@80:6; ;F; - <C
5i A C C  ,G- ;H(; ; 

 1 ' 

  '1 '  

-  
                 
         
        -  
         
!,, * +             
 
      - 
  
   
 8
' 3 7 %&

2 - 0 *

! c / 3
 ' / 3

c  3
†3 2!2†3*  
! c  )3

 c Bc  

 ' B/' 

- B †3c)†% ' C(D E
(&

 *, (/    (C† C((C)%&
 * E,   
 *, (      ,9* 8(
( *, ( c 
 * E,   
 *, (c
   ,9* (

3 ( E E( c 
3?-* >F)  
 *, (-      (
-c
- 9

 * E,   
 *, (          (
 c 

- 3 

Se requiere que cambie el nombre del LinkLnk.exe enlazador y el nombre de nuestro Link.exe
contenedor enlace.
Cuando tratamos de elaborar un proyecto DLL ActiveX, nuestro archivo de registro vinculador
contiene el siguiente resultado:

&   /14//41008/1<88<BBi 

''   ' (?I < 
- <Ci  ' C   5 "  C5:7C  /,G- 
- <Ci  ' C   5 "  C5:7Ci A/,G- 
- <Ci  ' C   5 "  C5:7C5!J!6,(- 
4!?#K< " 
4>#<- <Ci  ' C   5 "  C5:7Ci A/,- 
4"!<0&//000000 
4">"K"#! <D(?
D"8,045!"(?</,0 
4

4(? ! !?#<?4i#<!4 !@!<,  +,&4(@?!<8097 

(?I* 

  '*  
3      
                       
      !,,  c c           /  
    G !,,           !,,         G !-†
         % &               
 !,,%3  
  c  c                  

                  
   
     "                 &'  
      
      !,, /.        
 :         
         

Creación de la DLL de Windows

Así, después de examinar la tabla un archivo DLL de ActiveX de exportación, interceptar llamadas de
Visual Basic para el compilador, interceptar llamadas de Visual Basic para el enlazador, y la
comparación de los argumentos pasados al vinculador con las exigidas a C / C + + para generar un
archivo DLL de Windows, Por fin has identificado por las que no son capaces de crear con éxito un
archivo DLL de Windows con Visual Basic. Y afortunadamente, podemos evitar esa restricción.
Debemos ser capaces de crear un estándar de archivo DLL de Windows si no hacemos lo siguiente:

1. Cree un archivo. def para nuestro proyecto. Podemos especificar nuestras funciones
exportadas en el archivo de definición de varias maneras, pero lo mejor es mantenerlo simple.:

? !  
(K   

!" (i#(?- ;  %  '   - 


!Ji#"
 L/ 
('L1 

'LB 
") L8 

La instrucción NA E define el nombre de la DLL. La instrucción LIBRARY o debe preceder a la lista de


funciones exportadas o aparecer en la misma línea que la primera función. El archivo de definición.
También se enumerarán la posición ordinal de cada función exportada precedido por un símbolo @.

2 Decidir cómo queremos para interceptar la llamada al enlazador. Dos técnicas principales son
disponibles para hacer esto:

El parcheo de las importaciones de tabla de dirección (IAT), que exige que se construye un
Visual Basic complemento que modifica el TAI con el fin de interceptar llamadas en particular por
Visual Basic para la API de Win32. Aunque es sin duda el método más elegante, su complejidad hace
que sea un tema digno de un artículo separado.

La construcción de un enlazador proxy que intercepta la llamada al enlazador real, modifica los
argumentos de línea de comandos para pasar al enlazador, y luego llama al enlazador con los
argumentos correctos de línea de comandos. Este es el enfoque que utiliza para descubrir lo que los
argumentos de Visual Basic se pasa al compilador y enlazador, y es el enfoque que va a adoptar para
crear un archivo DLL de Windows.
En la construcción de nuestro enlazador proxy, queremos un diseño lo suficientemente flexible para
que podamos generar otros tipos de archivos, en caso necesario.

3 odificar los argumentos para el enlazador para agregar el / DEF interruptor junto a la ruta y el
nombre de nuestro archivo def.. Para ello, debe crear un estándar de Visual Basic proyecto EXE,
agregue una referencia al icrosoft Scripting Runtime Library, quitar el formulario del proyecto, y
añadir un módulo de código. El código fuente para el enlazador proxy es la siguiente:.

 !& 

i "    


'" *   i      

'i ( 

' '" 

'i " 

' " 

'
 "" 

' "?","%'A 

'  

' 

'#&" '
#&" ' 

 '+ ''  

"+ ",  #& ,i .- C* ,&- 

,D-&   -.
.--.#'  
,D */ 
,D- ''   ' (?I <- 
,D */ 
,D--. ' 
,D *1 

M
',
!& 
M
M!&   ', A  ' 
i +(" / '-,G-#& '  
i +   '1i N1 
i +(" i - C-
i + i i  ;/
M  
"+ ",@  i  

M@  
 ! (, 
(>  ",@!& ? ' +-
!-# 
 
+ 
 " *+#  
!(
(>  ",@!& ? ' +-!"-# 
 + 
  +#  
!(
(" * #!&  
?&

M   ''   '  
(" *# 
M
'  ,
! 
"
 + ",#& 
 
 +
,  
((" / - -#& ' 30# 
  i+#  
!(

M'    4
 
i +(" /  '-4
-#& '  
(i 30# 
  '+  'i  ;/.
 -4
!<-.  B8.
.  B8.--. 
   'i  
!(
M( ,!" & 
( # 
 i +(" / '-4!?#K-#& '  
  '+  'i  ;/.  B8.. 
  B8.--.   'i  
!(

M(  i   -
-&  - i- 
( i# 
  '+   '-,--,-/#& '  
!(

MD*      
,D- ''   '  '   <- 
,D */ 
,D--. ' 
,D *1 
!(

,D- (?I,!J!*- 
"-**,&-. ' 
(!,? '230# 
,D -!  *,,,- 
!,   
!(

,D */ 
,D-  '* - 
,  
!" 

-         


              
                   H    
   
             3    
      

   G!-†    ):  
          

       ' " 
           c'/     
            
I

'      
       
, E, E             , E

J             
     7 ,
      !,,     47 ,  "/  

Prueba de la DLL

 na vez que creemos nuestro DLL de Windows, el paso final es poner a prueba para asegurarse de
que funciona. Para ello, cree un nuevo proyecto EXE estándar (llamémosla athLibTest) y añadir un
módulo de código. Para asegurarse de que el código en nuestro proyecto se puede acceder a las
funciones exportadas por la DLL, se utiliza el estándar de Visual Basic instrucción Declare. Declaramos
nuestros tres exportados rutinas matemáticas en el módulo de código de la siguiente manera:

 !& 

i 
   ('- < C5i A C C' ,-  
   (( 
 
i 
   
'- < C5i A C C' ,-  
   (( 
 
i 
   ") - < C5i A C C' ,-  
      

A continuación, puede utilizar el código siguiente en el módulo de formulario para llamar a las rutinas
en el archivo DLL:

 !& 

i " '
' *  
&
',#&+
' ( &
',#& 
!" 

i " '(' *  
&(',#&+(' ( &(',#& 
!" 

i " '")  *  
&") ,#&+")   &") ,#& 
!" 

i "  '   
&(',#&+0 
&
',#&+/00 
&") ,#&+1 
!" 

Cuando llamamos a cada una de las funciones athLib, la ventana de la aplicación puede aparecer
como lo hace en la figura 2, lo que confirma que las llamadas a las rutinas athLib funciona como se
esperaba.