La Web del Programador: Comunidad de Programadores
 
    Pregunta:  7057 - COMO PASAR PARAMETROS A LAS DLLS
Autor:  pablo saez molina
Casi todos mis programas los hago en Visual Basic 6.0
Pero cuando necesito mas velocidad me gustaria usar dlls en
Assembler, que tambien conozco un poco.
He logrado hacer algunas dlls con MASM32, pero no encuentro la manera de pasar los parametros desde Visual Basic,mejor dicho,como hacer que la dll reciba esos parametros y trabaje con ellos.
Gracias de antemano.

  Respuesta:  Manuel
***** En VB ***
Private Declare Function NombreFuncion Lib "C:\Ruta\NombreDll.dll" _
(ByVal Parametro1 As Long, ByVal Parametro2 As Long) As Long

*******En la DLL.asm*******
.486
.model flat,stdcall
.stack 8000h ; Opciopnal
option casemap:none ; Opcional

; Archivos que necesites incluir:
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.inc

.const
; Constantes si las necesitas
.Data
; Datos inicializados que necesites
Data?
; Datos sin inicializar que necesites

.Code

DllEntrada proc hInstancia, Razon, Reservado
mov eax,1
ret
DllEntrada endp

NombreFuncion proc Param1,Param2
mov eax,Param1
mov edx,Param2
; ....
; ....
mov eax, Valor que quieres retornar
ret
NombreFuncion endp
end DllEntrada
******************
*** En Dll.def ***
LIBRARY NombreDll
EXPORTS
NombreFuncion
*******************

Si quieres pasarle un String haz lo siguiente:

En VB:
Private Declare Function NombreFuncion Lib "C:\Ruta\NombreDll.dll" _
(ByVal lpStrA As Any, ByVal lpStrB As Any) As Long

Dim VarStr1 As Strin *8192
Dim VarStr2 As Strin *8192

' tienes que especificar el tamaño. como ejemplo
te he puesto 8192

La llamada seria:

N = NombreFuncion(VarStr1,VarStr2)
N recogera el valor del registro EAX cuando salga de la funcion ASM.

La recogida en ASM asi de facil

NombreFuncion proc uses edi esi Param1,Param2
mov esi,Param1
mov edi,Param2
mov ecx,8192
shr ecx,2 ; DWORDs
cld
rep movsd
; ....Esto copiaria String 1 en String 2
; ....
mov eax, 0
ret
NombreFuncion endp

Por supuesto que los parametros no tienen por que
ser del mismo tipo, puedes incluso pasar la direccion de un Array...

Espero te sirva...
Saludos.

  Respuesta:  Paul Guerra
Al pasar parámetros a una función, también hay que tener en cuenta que VB utiliza la convensión de llamadas STDCALL. Al utilizar esta convensión de llamada, se deben sacar de la pila todos los parámetros pasados a la función. De lo contrario, VB podría generar un error.

  Respuesta:  Alejandro
Hola

Al llamar a la función de la DLL se pasan los parámetros a la pila y por último la dirección de retorno.
En tu DLL en ASM puedes recoger los parámetros directamente de la pila, (por ejemplo mov eax,[esp+8]) sabiendo siempre que en la primera DWORD a la que apunta la pila está la dirección de retorno.
Espero que esto te sirva de ayuda

Saludos