Domanda

Sto cercando di creare una DLL che esporta una funzione chiamata "GetName". Mi piacerebbe altro codice per essere in grado di chiamare questa funzione senza dover conoscere il nome della funzione alterati.

Il mio file di intestazione si presenta così:

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT TCHAR * CALLBACK GetName();

Il mio codice è simile al seguente:

#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");
}

Quando costruisco, la DLL esporta ancora la funzione con il nome: "_GetName @ 0".

Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Piccola correzione - per il successo la risoluzione del nome da clinet

extern "C"

deve essere il più sul lato delle esportazioni come l'importazione.

extern "C" ridurrà nome proc a:. "_GetName"

Più sopra si può forzare qualsiasi nome con l'aiuto della sezione EXPORTS nel DEF file

Altri suggerimenti

Questo è normale per un'esportazione DLL con una convenzione __stdcall. Il @N indica il numero di byte che la funzione prende nelle sue argomentazioni - nel tuo caso , pari a zero.

Si noti che pagina MSDN su Esportazione da una DLL dice espressamente a "utilizzare il __stdcall che chiama la convenzione" quando si usa "la parola chiave __declspec (dllexport) nella definizione della funzione".

la risposta giusta è la seguente:

extern "C" int MyFunc(int param);

e

int MyFunc(int param);

è due dichiarazioni che utilizza diversi denominazione interna, prima - è in stile C, secondo -. In stile C ++

denominazione interna necessaria per strumenti di compilazione per determinare quale funzione argomenti riceve, che tipo rendimenti, ecc, in quanto C ++ è più complicato (OOP di, sovraccarico, funzioni virtuali, ecc) - che utilizza la denominazione più complicato. convenzione di chiamata colpisce anche entrambi C e C ++ namings.

entrambi questo stili di denominazione viene applicato quando si utilizza __declspec (dllexport) nello stesso modo.

se si vuole omettere nome storpiatura della routine esportata, aggiungere un file di definizione del modulo al progetto, di tipo in esso (in questo caso non richiesto di declspec dllexport):

LIBRARY mylib
EXPORTS
  MyFunc

questo ometterà nome decorazione esplicito (campioni al di sotto).

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

È possibile utilizzare la "-Wl, - uccidi-a" opzione del linker per disabilitare nome storpiatura

Per esempio, in Code :: Blocks, nelle impostazioni del linker personalizzati, aggiungere: -Wl, - kill-a

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top