¿por qué no puedo acceder a mi función DLL
-
28-09-2019 - |
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.
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.