COMO CONECTAR VISUAL C++ Y VISUAL BASIC A TRAVÉS DE UNA DLL


Creo que en algún momento nos puede ser de gran utilidad
Esta explicación ejemplo lo que hace es crear una dll en visual c++ con una función desarrollada en visual c++ y llamar a esta función desde visual Basic. La funcion lo unico que hace es aumentar un valor en mil pero es lo de menos. Lo importante es la conexión entre los dos lenguajes.

En Visual C++

FILE/NEW/WIN 32 DYNAMIC LIBRARY
Project/add toproject c/c++ header file que llamaremos personas.h
En el .h
#If !defined (_personas_h_)

#define _personas_h_

declaramos la función que vamos a llamar desde visual.

¿qué vamos a hacer con esta función? Llamarla desde visual basic luego la exportaremos.Para designar una fución o una variable como exportable tenemos que ponerle delante de el tipo de datos la convención que nos indica que vamos a exportar que es __declspec(dllexport). Como no vamos a hacer una dll para una sola función y poner la convención es muy pesado haremos un define

#define dllexport __declspec(dllexport)

y la función que en un principio habiamos declarado asi

int AumentarNom(int nomina)

ahora quedará asi

dllexport int AumentarNom(int nomina)

#end if

en el cpp definimos la función
primero incluimos el archivo de cabecera

#include "C\903684……\personas.h"

y definimos la función

Aumentar nom(int nomina)

{

if(nomina>5000)

return nomina

else return(nomina+1000)

}

Compilamos la dll y ya está.

Solo falta un pequeño detalle

Visual basic no lee la comvención de llamada cdecl que viene por defecto en visual c++. Tendremos pues que cambiar la convención de llamada a una que entienda visual basic que es la _stdcall

Seleccionamos el cpp donde hay la función y en la pestaña C/C++ de Settings, en calling convention lo cambiaremos a stdcall y volveremos a compilar.

 

Hacemos la llamada desde Visual Basic

Añadimos un form y un modulo .

En el modulo escribimos

(pepe.dll es el nombre que le hemos dado a la dll)

Public function declare AumetarNom Lib "C:\…..\pepe.dll alias "#1"(byval nomina as long) as long

Con el alias le proporcionamos un punto de entrada, una dirección.Le pasamos pues un nº ordinal que nos indica donde está la funcion en la dll(la dirección de la función)

Las funciones se van ordenando una detrás de otra en la dll, lutgo le pasamos el nº ordinal de la funcioon que será el punto de entrada, la manera como entraremos a la dll

Hay una utilidad que se llama dumpbin.exe que nos proporciona los nº ordinales de las fuciones de las dll

El int de visual c++ lo declaro como byval nombrevariable long

Porque en

VISUAL C++ EQUIVALE EN VISUAL BASIC

ATOM BYVAL INTEGER

SHORT BYVAL INTEGER

INT BYVAL LONG

BYTE BYVAL BYTE

CHAR BYVAL BYTE

Y finalmente llamamos a la función en el clic de un botón

Dim pepe as long

(txt es un textbox que hemos puesto en el form.)

Pepe= aumentarnom(clng(txt.text))

Txt.text = pepe

Un Saludo


Joaquin Roca Verges
[email protected]