para descargar c++ c extern name-mangling

c++ - descargar powershell 3.0 para windows 7



¿Cómo detengo el cambio de nombre de la función exportada de mi DLL? (5)

Intento crear una DLL que exporte una función llamada "GetName". Me gustaría que otro código pueda llamar a esta función sin tener que conocer el nombre de la función destruida.

Mi archivo de encabezado se ve así:

#ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT TCHAR * CALLBACK GetName();

Mi código se ve así:

#include <windows.h> #include "PluginOne.h" int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { return TRUE ; } EXPORT TCHAR * CALLBACK GetName() { return TEXT("Test Name"); }

Cuando construyo, el DLL todavía exporta la función con el nombre: "_GetName @ 0".

¿Qué estoy haciendo mal?


Corrección pequeña: para resolver con éxito el nombre por clinet

extern "C"

debe estar en el lado de la exportación como en la importación.

Extern "C" reducirá el nombre de proc a: "_GetName".

Más sobre usted puede forzar cualquier nombre con la ayuda de la sección EXPORTACIONES en el archivo .def



Puede usar el conmutador del enlazador "-Wl,-kill-at" para desactivar el cambio de nombre.

Por ejemplo, en Code :: Blocks, en la configuración del enlazador personalizado, agregue: -Wl, - kill-at



la respuesta correcta es la siguiente:

extern "C" int MyFunc(int param);

y

int MyFunc(int param);

son dos declaraciones que usan diferentes nombres internos, primero - está en estilo C, segundo - en el estilo C ++.

se requieren nombres internos para las herramientas de compilación para determinar qué argumentos recibe la función, qué tipo devuelve, etc., ya que C ++ es más complicado (oop, sobrecargado, funciones virtuales, etc.) - usa nombres más complicados. la convención de llamadas también afecta los nombres c y c ++.

ambos estilos de nomenclatura se aplican al usar __declspec (dllexport) de la misma manera.

si desea omitir el cambio de nombre de la rutina exportada, agregue un archivo de definición de módulo a su proyecto, escríbalo (en este caso no es necesario que declspec dllexport):

LIBRARY mylib EXPORTS MyFunc

esto omitirá la decoración explícita del nombre (ejemplos a continuación).

_MyFunc (c style, __cdecl) _MyFunc@4 (c style, __stdcall) ?MyFunc@@YAHH@Z (c++ style, __cdecl) ?MyFunc@@YGHH@Z (c++ style, __stdcall)