Llamar a funciones en una DLL desde C++


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

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

¿Cómo lo llamo?

Author: ArtB, 2009-02-12

6 answers

Hay muchas maneras de hacer esto, pero creo que una de las opciones más fáciles 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 desde la DLL.

ADVERTENCIA: El enfoque de archivo de definición funciona mejor para nombres de símbolos sin decorar. Si desea exportar símbolos decorados, probablemente sea mejor que NO USE el enfoque de archivo de definición.

Aquí hay un ejemplo simple de cómo esto está hecho.

Paso 1: Defina la función en la exportación .archivo h.

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

Paso 2: Defina la función en la exportación .archivo 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 la exportación .def archivo de definición.

EXPORTS    IsolatedFunction          @1

Paso 4: Crea un proyecto DLL y agrega la exportación .exportación cpp y .def archivos para este proyecto. Al construir este proyecto se creará una exportación .dll y una exportación .archivo lib .

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

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

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;
}
 20
Author: jussij,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-12 04:36:58

También puede exportar funciones desde 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. Véase MSDN .

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

Entonces, en la aplicación exe solo tiene que #incluir un encabezado de la dll con las definiciones adecuadas, y agregar el proyecto dll como una dependencia al exe aplicación.

Marque esta otra pregunta si desea investigar más este punto Exportando funciones desde una DLL con dllexport.

 9
Author: Ismael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:23

Puede ir a la ruta LoadLibrary/GetProcAddress (como Harper mencionó en su respuesta, aquí está link to the run-time dynamic linking MSDN sample again) o puede vincular su aplicación de consola a la .lib producido a partir del proyecto DLL e incluye el hea.archivo h con la declaración de su función (como se describe en el ejemplo de MSDN de enlace dinámico en tiempo de carga )

En ambos casos, debe asegurarse de que su DLL exporta la función que desea llamar correctamente. El la forma más fácil de hacerlo es usando __declspec(dllexport) en la declaración de la función (como se muestra en la creación de una biblioteca de enlace dinámico simple MSDN sample), aunque también puede hacerlo a través de la correspondiente .archivo def en su proyecto DLL.

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

 6
Author: Franci Penov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 23:52:22

Los siguientes son los 5 pasos requeridos:

  1. declarar el puntero de la función
  2. Cargar la biblioteca
  3. Obtener la dirección del procedimiento
  4. asígnelo al puntero de función
  5. llame 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;
}
 4
Author: Kathir Softwareandfinance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-10 22:04:41

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

 0
Author: Harper Shelby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 23:37:49

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

 0
Author: Tim Matthews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 23:54:06