una todas tipos programacion parametros llamar las funciones funcion estructura ejemplos como c++ visual-studio-2008 dll dllimport

todas - tipos de parametros en c++



Funciones de llamada en una DLL de C++ (6)

Cuando se creó el DLL, una lib de importación generalmente se crea automáticamente y debe usarlo vinculado a su programa junto con los archivos de encabezado para llamarlo, pero si no puede llamar manualmente las funciones de Windows como LoadLibrary y GetProcAddress para que funcione.

Tengo una solución en VS 2008 con 2 proyectos en ella. Uno es un archivo DLL escrito en C ++ y el otro es una aplicación simple de consola C ++ creada a partir de un proyecto en blanco. Me gustaría saber cómo llamar a las funciones en el archivo DLL desde la aplicación.

Supongamos que estoy comenzando con un proyecto C ++ en blanco y que quiero llamar a una función llamada int IsolatedFunction(int someParam)

¿Cómo lo llamo?


Hay muchas maneras de hacerlo, pero creo que una de las opciones más sencillas es vincular la aplicación a la DLL en el momento del enlace y luego usar un archivo de definición para definir los símbolos que se exportarán de la DLL.

CAVEAT: el enfoque del archivo de definición funciona mejor para los nombres de símbolo sin decorar . Si desea exportar símbolos decorados, probablemente sea mejor NO USAR el enfoque de archivo de definición.

Aquí hay un ejemplo simple de cómo se hace esto.

Paso 1: defina la función en el archivo export.h

int WINAPI IsolatedFunction(const char *title, const char *test);

Paso 2: defina la función en el archivo export.cpp .

#include <windows.h> int WINAPI IsolatedFunction(const char *title, const char *test) { MessageBox(0, title, test, MB_OK); return 1; }

Paso 3: defina la función como una exportación en el archivo de definición export.def .

EXPORTS IsolatedFunction @1

Paso 4: cree un proyecto DLL y agregue los archivos export.cpp y export.def a este proyecto. La construcción de este proyecto creará un export.dll y un archivo export.lib .

Los dos pasos siguientes enlazan con la DLL en el momento del enlace. Si no desea definir los puntos de entrada en el tiempo del enlace, ignore los siguientes dos pasos y use LoadLibrary y GetProcAddress para cargar el punto de entrada de la función en el tiempo de ejecución.

Paso 5: Cree un proyecto de aplicación de prueba para usar el archivo dll agregando el archivo export.lib al proyecto. Copie el archivo export.dll a la misma ubicación que el ejecutable de la consola de prueba .

Paso 6: llame a la función IsolatedFunction desde dentro de la aplicación de prueba como se muestra a continuación.

#include "stdafx.h" // get the function prototype of the imported function #include "../export/export.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // call the imported function found in the dll int result = IsolatedFunction("hello", "world"); return 0; }


Los siguientes son los 5 pasos requeridos:

  1. declarar el puntero de la función
  2. Carga la biblioteca
  3. Obtener la dirección del procedimiento
  4. asignarlo al puntero de la función
  5. llamar a la función usando el puntero de función

Puede encontrar la captura de pantalla paso a paso VC ++ IDE en http://www.softwareandfinance.com/Visual_CPP/DLLDynamicBinding.html

Aquí está el fragmento de código:

int main() { /*** __declspec(dllimport) bool GetWelcomeMessage(char *buf, int len); // used for static binding ***/ typedef bool (*GW)(char *buf, int len); HMODULE hModule = LoadLibrary(TEXT("TestServer.DLL")); GW GetWelcomeMessage = (GW) GetProcAddress(hModule, "GetWelcomeMessage"); char buf[128]; if(GetWelcomeMessage(buf, 128) == true) std::cout << buf; return 0; }


Puede ir a la ruta LoadLibrary / GetProcAddress (como Harper mencionó en su respuesta, aquí hay un enlace al dinámico en tiempo de ejecución que enlaza el ejemplo de MSDN ) o puede vincular su aplicación de consola al .lib producido desde el proyecto DLL e incluir el hea .h archivo con la declaración de su función (como se describe en la dinámica de tiempo de carga que enlaza la muestra de MSDN )

En ambos casos, debe asegurarse de que su DLL exporta la función que desea llamar correctamente. La forma más sencilla de hacerlo es mediante __declspec (dllexport) en la declaración de la función (como se muestra en la creación de una muestra simple de MSDN de la biblioteca de vínculos dinámicos ), aunque también puede hacerlo a través del archivo .def correspondiente en su proyecto DLL.

Para obtener más información sobre el tema de las DLL, debe examinar el tema MSDN About Dynamic-Link Libraries .


Suponiendo que está hablando de la carga de DLL en tiempo de ejecución dinámico, está buscando LoadLibrary y GetProAddress. Hay un ejemplo en MSDN .


También puede exportar funciones de dll e importar desde el exe, es más complicado al principio, pero al final es mucho más fácil que llamar a LoadLibrary / GetProcAddress. Ver MSDN .

Al crear el proyecto con el asistente de VS, hay una casilla de verificación en el dll que le permite exportar funciones.

Luego, en la aplicación exe, solo debe #incluir un encabezado del dll con las definiciones adecuadas, y agregar el proyecto dll como una dependencia a la aplicación exe.

Consulte esta otra pregunta si desea investigar este punto adicional Exportando funciones desde una DLL con dllexport .