2011-10-04 9 views
8

principio pensé punto de entrada en dlls DLLMain pero luego cuando intento importar en C# me sale un error que punto de entrada no se encuentra aquí es mi código:¿Cómo puedo configurar un punto de entrada para un archivo 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; 
} 

¿Cómo puedo establecer un punto de entrada para mi dll? Y si no te importa, ¿puedes darme una pequeña explicación sobre el punto de entrada?

¿Tengo que configurar import el mismo dll nuevamente y cambiar el punto de entrada para que pueda usar otras funciones en el mismo dll? gracias por adelantado.

Respuesta

10

En su ejemplo, parece que tiene la intención de que Test() sea un punto de entrada, pero no lo está exportando. Incluso si comienza a exportarlo, es posible que no funcione correctamente con el nombre de C++ "decoración" (mangling). Yo te sugeriría que la redefinición de su función como:

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

El componente extern "C" eliminará C++ renombrado de nombres. El componente __declspec(dllexport) exporta el símbolo.

Consulte http://zone.ni.com/devzone/cda/tut/p/id/3056 para obtener más información.

Editar: Puede agregar tantos puntos de entrada como desee de esta manera. El código de llamada simplemente debe saber el nombre del símbolo que se va a recuperar (y si está creando un .lib estático, eso se ocupa de usted).

+1

Use __stdcall para la declaración C o CallingConvention.Cdecl en la declaración C#. –

Cuestiones relacionadas