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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top