views:

1114

answers:

4

I'm trying to create a DLL that exports a function called "GetName". I'd like other code to be able to call this function without having to know the mangled function name.

My header file looks like this:

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

EXPORT TCHAR * CALLBACK GetName();

My code looks like this:

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

When I build, the DLL still exports the function with the name: "_GetName@0".

What am I doing wrong?

A: 

http://weseetips.com/2008/07/16/what-is-name-mangling-and-how-to-disable-name-mangling/

// Disable name Mangling for single function.
extern "C" void Function( int a, int b );

// Disable name Mangling for group of functions.
extern "C"
{
    void Function1( char a, char  b );
    void Function2( int a, int   b );
    void Function3( float a, float b );
}
Don Dickinson
That is what Slapout has done
Mark
sorry didn't notice the macro.
Don Dickinson
And it doesn't even stop C name mangling. The _ is still prepended.
Rob K
+5  A: 

Small correction - for success resolving name by clinet

extern "C"

must be as on export side as on import.

extern "C" will reduce name of proc to: "_GetName".

More over you can force any name with help of section EXPORTS in .def file

Dewfy
+3  A: 

This is normal for a DLL export with a __stdcall convention. The @N indicates the number of bytes that the function takes in its arguments -- in your case, zero.

Note that the MSDN page on Exporting from a DLL specifically says to "use the __stdcall calling convention" when using "the keyword __declspec(dllexport) in the function's definition".

Mark Rushakoff