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 |