martes, 19 de junio de 2007

Compartiendo datos entre VB6 y C/C++

Como siempre es de utilidad implementar módulos escritos en otro lenguaje a tu interfaz VB, es que explico en breves pasos como crear una DLL en VC++ (aplicable a otros compiladores) para linkearla desde VB6.

Los pasos son los siguientes:
1. En VC++ creamos una dll tradicional (librería dinámica) y procuramos declarar nuestras funciones dentro el bloque:

extern "C"
{
funciones
}

2. Creamos las funciones pero considerando que el tipo de llamada debe ser WINAPI (que es la estándar de las APIs de windows) y tomando precaución de las compatibilidades entre los tipos de variables de VB y C++ que son muy diferentes.
Para que tengas una idea detallo algunos tipos y sus equivalentes:

VB Bytes C/C++
----------------------------------------------
Byte 1 char
Integer 2 short
Integer 2 unsigned short
Long 4 int
Long 4 unsigned int
String n char *

Las cadenas tipo String/char *, pueden ser de n caracteres hasta encontrar un caracter NIL ASCII(0).

ej:
extern "C"
{
int WINAPI MiFuncion1(char * micadena);
}

int WINAPI MiFuncion1(char * micadena)
{
strcpy(micadena, "Hola Mundo desde C!");
return 0; // Todo OK
}

3. Luego creamos y agregamos al proyecto un archivo con extensión .def, donde colocaremos la definición que será presentada externamente por la DLL:

LIBRARY 'Nombre Librería'
DESCRIPTION 'Una Descripción'
EXPORTS
MiFuncion1 @1
MiFuncion2 @3
MiFuncion3 @2

Donde el @n especifica la cantidad de parámetros que acepta la función.

4. Ahora y una vez compilada nuestra DLL solo basta linkearla desde la aplicación VB, para ello creamos un nuevo Modulo y declaramos en ella la/las función de la DLL

Public Declare Function MiFuncion1 Lib "MiLibreria.dll" (ByVal Nombre As String) As Long

De esta forma declaramos que existe la función "MiFuncion1" que se encuentra en la librería "MiLibreria.dll" y con 1 parámetro del tipo "ByVal Nombre As String".

Si quieres ejecutar el proyecto desde el entorno IDE del VB, asegurare de declarar la ruta completa a la DLL ej: ...Lib "C:\MiProyecto\MiLibreria.dll"..., de lo contrario no podrá encontrarla. No así si tienes compilado tu proyecto y tu DLL en el mismo directorio.

5. Cuando pasas parámetros a tu DLL debes considerar ciertas cosas:
- Las declaraciones deben ser generalmente ByVal, excepto cuando pasas una estructura como parámetro.
- Cuando pasas un String para que retorne un valor en ella DEBES asignarle espacio!!, esto lo logras con la función

MiString = String(255, Chr$(0))

o simplemente

MiString = Space(255)

Ambas son validas y consiguen su objetivo.

Cuando obtengas una cadena que hayas establecido desde tu DLL, asegurate de limpiarla de caracteres basura que quedan en el espacio sobrante que le asignaste, esto es porque en C el carácter ASCII(0) se considera fin de cadena pero en VB es valido como un caracter mas, así que tendrás que considerar todo lo que este antes de un Chr(0) como tu cadena y el resto será basura.

1 comentario:

Anónimo dijo...

No entendi un sorete, pero parece algo muy bueno asi q MUCHAS GRACIAS jeje