Pregunta

Estoy intentando cargar un archivo DLL de forma dinámica utilizando LoadLibrary(), que trabaja, sin embargo no puedo entonces obtener la dirección de la función en la DLL que estoy tratando de llamada.

función DLL: (en archivo CPP)

_declspec(dllexport) void MyDllFunc()
{
    printf("Hello from DLL");
}

Código de llamada:

typedef void (*MyDllFuncPtr)();

int _tmain(int argc, _TCHAR* argv[])
{

    HINSTANCE LoadMe;
    LPCWSTR str = L"C:\\Users\\Tony\\Documents\\Visual Studio 2008\\Projects\\DLL Loading\\Release\\MyDll.dll";

    LoadMe = LoadLibrary(str);

    if(LoadMe != 0)
        printf("Successfully Loaded!\r\n");
    else
        printf("Loading Failed \r\n" );


    MyDllFuncPtr func;

    func = (MyDllFuncPtr)GetProcAddress(LoadMe, "MyDllFunc");

    if (func != NULL)
        func();

    FreeLibrary(LoadMe);

}

retornos func NULL !!!

¿Qué estoy haciendo mal?

Este es un proyecto de consola Win32.

¿Fue útil?

Solución

Comentario

extern "C" _declspec(dllexport) void MyDllFunc()

Otros consejos

Lo estás haciendo mal. __declspec (dllexport) pares con __declspec (dllimport).

#1: In the DLL, declare the function's prototype with __declspec(dllexport).
#2: In the .exe, declare the function's prototype with __declspec(dllimport).
#3: Compile the .dll. You should also get a .lib file.
#4: Link the .exe with the .lib, and compile.
#5: Success.

Cuando se utiliza __declspec (dllimport) y __declspec (dllexport), no será necesario tocar las funciones WinAPI para cargar un archivo DLL. dllimport / exportación lo hace todo por ti. Además, no es necesario que extern C nada.

Sus funciones exportadas de nombre están siendo decorado cuando se utiliza __ declspec (dllexport) , puede reducir la decoración utilizando extern "C" , sin embargo, no será sin decorar completamente el símbolo, para hacer eso es necesario utilizar un def archivo y exportarlo como un símbolo llamado, lo que necesita para su uso con el GetProcAddress / decorada nombre del símbolo destrozado, que es la abreviatura cuando se exporta utilizando extern "C".

Si el archivo DLL se construye como una DLL de C ++, nombres Sus funciones van avanzando. Este es el compilador dependiente. Me gustaría recomendar encarecidamente para que sea un archivo DLL de C (C + C ++ interfaz de agallas). No tengo un ejemplo en mí en este momento, pero debería ser capaz de encontrar algo en la red.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top