2011-10-04 19 views
8

primo momento ho pensato punto di ingresso nella DLL DLLMain ma poi quando si tenta di importare in C# ottengo un errore che entrypoint non è stato trovato Ecco il mio codice:Come posso impostare un entrypoint per una dll

#include <Windows.h> 

int Test(int x,int y) 
{ 
    return x+y; 
} 

BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 
    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
     MessageBox(0,L"Test",L"From unmanaged dll",0); 
    case DLL_THREAD_ATTACH: 
    case DLL_THREAD_DETACH: 
    case DLL_PROCESS_DETACH: 
     break; 
    } 
    return TRUE; 
} 

Come posso impostare un punto di ingresso per la mia dll? E se non ti dispiace puoi darmi poche spiegazioni sul punto di ingresso?

Come devo impostare di importare nuovamente la stessa dll e modificare il punto di ingresso in modo da poter utilizzare altre funzioni nella stessa dll? Grazie in anticipo.

risposta

10

Nell'esempio, sembra che Test() sia un punto di ingresso, ma non lo si sta esportando. Anche se inizi ad esportarlo, potrebbe non funzionare correttamente con il nome C++ "decorazione" (mangling). Io suggerirei di ridefinire la funzione come:

extern "C" __declspec(dllexport) int Test(int x,int y) 

Il componente extern "C" rimuoverà C++ nome mangling. Il componente __declspec(dllexport) esporta il simbolo.

Vedere http://zone.ni.com/devzone/cda/tut/p/id/3056 per ulteriori dettagli.

Modifica: è possibile aggiungere tutti i punti di ingresso che si desidera in questo modo. Il codice di chiamata deve semplicemente conoscere il nome del simbolo da recuperare (e se si sta creando un .lib statico, che si prende cura di esso per voi).

+1

Utilizzare __stdcall per la dichiarazione C o CallingConvention.Cdecl nella dichiarazione C#. –

Problemi correlati