2011-01-25 14 views
7

Duplicar posibles:
How do I stop name-mangling of my DLL's exported function?Unmangling C++ función DLL Nombres

Tengo un archivo DLL que está escrito en C++. Los nombres de las funciones exportadas deben estar desactivados. Por ejemplo, int MyFunc(int Param1, int Param2); debe aparecer a una aplicación externa que intenta llamar a la función de biblioteca simplemente como MyFunc. Sin embargo, cuando lo miro usando Dependency Walker, parece que [email protected]. Esta es la forma en que he declarado en C++:

extern "C" __declspec(dllexport) int WINAPI MyFunc(int Param1, int Param2); 

me pareció que el extern "C" que hacer el truco. ¿Cómo me deshago del mangling? Gracias.

+0

Un archivo .def debe hacer el truco. – ruslik

+2

¿duplicado? http://stackoverflow.com/questions/1467144/how-do-i-stop-name-mangling-of-my-dlls-exported-function – MerickOWA

+0

también enlace útil - http://msdn.microsoft.com/en- US/library/x7kb4e2f (v = VS.80) .aspx – MerickOWA

Respuesta

8

maneras de deshacerse de mangling: (suponiendo MSVC es el entorno de construcción)

de exportación a través de un archivo .def.

Exportar como extern "C" asegurando que se utiliza la convención de llamadas __cdecl. __stdcall antepone _ y post-cuelga @ a las funciones exportadas dll incluso cuando se usa extern "C".

extern "C" __declspec(dllexport) int __cdecl MyFunc(int Param1, int Param2); 

Exportar utilizando una directiva #pragma. Necesitas pasar el nombre completamente destrozado en el otro lado de esto. __FUNCDNAME__ es una directriz útil para poner en una macro en una función a la lista de su nombre decorado,

#pragma comment(linker, "/EXPORT:[email protected]"); 
+0

¿El 'extern" C "' asegura que se usa la convención de llamadas '__cdecl', o son esas dos cosas separadas? –

+0

extern "C" simplemente asegura que el símbolo es compatible con el código C.__cdecl y __stdcall son directivas separadas que se pueden aplicar a las funciones de C++ totalmente decoradas –

+1

¿Debe el pragma ir inmediatamente antes de la declaración de la función? –

2

Esto es probablemente porque usted no puso extern "C" declspec en la definición de la función, solo lo pone en la declaración.

+0

Está en la declaración y la definición. –

0

En la cabecera (.h ), lo definen como:

extern "C" 
{ 
    __declspec(dllexport) int __stdcall MyFunc(int Param1, int Param2); 
} 

Luego, el la implementación (.cpp ) de la función:

extern "C" 
{ 
    __declspec(dllexport) int __stdcall MyFunc(int Param1, int Param2) 
    { 
    // ... code ... 
    } 
} 
+0

Tiene que hacerse usando corchetes? Declarar 'extern" C "' ¿no hace la misma cosa? –

+0

@Jim Tienes razón, no necesitas corchetes. Simplemente lo puse en aras de la integridad. – karlphillip

3

el subrayado inicial y @8 sufijo no son de manipulación de nombres C++, sino más bien denotar stdcall convención de llamadas, como es normal para dllexport.

+0

Bien. ¿Cómo me deshago de ellos? –

+0

Cambia su convención de llamadas a una que no hace tales cambios. –

+0

prueba la convención __cdecl. – ThomasMcLeod

0

en sistemas GNU no es C++ filt

+0

Y en Windows es 'undname'. Pero la pregunta es sobre detener el proceso de destrucción y no decodificarlo. – Rup