Share via


Llamar a funciones de un archivo DLL desde aplicaciones programadas en Visual Basic

Para que las aplicaciones programadas en Visual Basic (o en otros lenguajes, como Pascal o Fortran) llamen a funciones en un archivo DLL de C/C++, las funciones se deben exportar mediante la convención de llamada correcta sin que el compilador realice ninguna decoración de nombre.

__stdcall crea la convención de llamada correcta para la función (la función llamada limpia la pila y los parámetros se pasan de derecha a izquierda), pero decora el nombre de la función de forma diferente. Por lo tanto, cuando se usa __declspec(dllexport) en una función exportada en un archivo DLL, se exporta el nombre representativo.

La decoración de nombre de __stdcall antepone al nombre del símbolo un carácter de subrayado ( _ ) y anexa al símbolo un carácter de arroba (@) seguido del número de bytes de la lista de argumentos (el espacio de pila necesario). Como resultado, cuando la función se declara como:

int __stdcall func (int a, double b)

se decora con _func@12 en la salida.

La convención de llamada de C (__cdecl) decora el nombre con _func.

Para obtener el nombre representativo, use /MAP. El uso de __declspec(dllexport) hace lo siguiente:

  • Si la función se exporta con la convención de llamada de C (__cdecl), se quita el carácter de subrayado inicial ( _ ) cuando se exporta el nombre.

  • Si la función que se va a exportar no usa la convención de llamada de C (por ejemplo, __stdcall), se exporta el nombre representativo.

Dado que no hay ninguna manera de invalidar dónde se produce la limpieza de la pila, debe usar __stdcall. Para quitar la decoración de nombres con __stdcall, debe especificarlos mediante alias en la sección EXPORTS del archivo .def. Esto se muestra a continuación para la siguiente declaración de función:

int  __stdcall MyFunc (int a, double b);
void __stdcall InitCode (void);

En el archivo .def:

EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

Para que los programas escritos en Visual Basic puedan llamar a archivos DLL, se debe usar en el archivo .def la técnica de alias que se muestra en este tema. Si el alias se realiza en el programa de Visual Basic, no es necesario usar el alias en el archivo .def. Puede llevarse a cabo en el programa de Visual Basic si se agrega una cláusula de alias a la instrucción Declare.

¿Qué más desea saber?

Consulte también

Creación de archivos DLL de C/C++ en Visual Studio