perché non posso avere accesso alla mia funzione DLL
-
28-09-2019 - |
Domanda
Sto cercando di caricare una DLL in modo dinamico utilizzando LoadLibrary()
, che funziona, comunque non posso quindi ottenere l'indirizzo della funzione nella DLL che sto cercando di chiamata.
funzione DLL: (nel file di CPP)
_declspec(dllexport) void MyDllFunc()
{
printf("Hello from DLL");
}
Prefisso telefonico internazionale:
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);
}
ritorna FUNC NULL !!!
Che cosa sto facendo di sbagliato?
Si tratta di un progetto di console Win32.
Soluzione
Scrivi
extern "C" _declspec(dllexport) void MyDllFunc()
Altri suggerimenti
Si sta facendo male. __declspec (dllexport) coppie 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.
Quando si utilizza __declspec (dllimport) e __declspec (dllexport), non hai mai bisogno di toccare le funzioni WinAPI per caricare una DLL. dllimport / export fa tutto per te. Inoltre, non è necessario extern C nulla.
I tuoi esportati del nome funzioni sono in decorato quando si utilizza __ declspec (dllexport) , è possibile ridurre la decorazione con extern "C" , tuttavia, non sarà completamente non decorato il simbolo, per farlo è necessario utilizzare un def il file ed esportarlo come un simbolo di nome, altrimenti è necessario utilizzare GetProcAddress
utilizzando decorato il nome storpiato / simbolo, che è breve in caso di esportazione utilizzando extern "C"
.
Se la DLL è costruito come una DLL C ++, i nomi le sue funzioni cambieranno. Questo è compilatore dipendente. Mi consiglia vivamente di fare una DLL C (C + C ++ interfaccia budella). Non ho un esempio su di me in questo momento, ma si dovrebbe essere in grado di trovare qualcosa in rete.