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
Esto es normal para una exportación DLL con una convención __stdcall
. El @N
indica el número de bytes que la función toma en sus argumentos ; en su caso, cero.
Tenga en cuenta que la página de MSDN sobre Exportar desde una DLL dice específicamente "usar la convención de llamadas de llamada directa" cuando usa "la palabra clave __declspec (dllexport) en la definición de la función".
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)