Function name mangling in DLLs

-- DLL notes 3 of <Windows via C/C++>

 

Normally, C++ compilers mangle function and variable names. And there are some ways to change the way compilers mangling: 
    
extern "C"
    
Using extern "C" tells the compiler not to mangle the variable or function names. 

__stdcall

Microsoft's C compiler mangles C functions even if you're not using C++ at all. When C functions are exported using __stdcall, Microsoft's compiler mangles the function names by prepending a leading underscore and adding a suffix of an @ sign followed by a number that indicates the count of bytes that are passed to the function as parameters. For example, this function is exported as _MyFunc@8 in the DLL's export section.

__declspec(dllexport) LONG __stdcall MyFunc(int a, int b);
   
Here is an example:

     

   
   
   
   
#define MYLIBAPI __declspec(dllexport)

MYLIBAPI int add(int, int);

MYLIBAPI int add(int, int, int);

MYLIBAPI int __stdcall addstd(int, int);

extern "C" MYLIBAPI int addextern(int, int);

extern "C" MYLIBAPI int __stdcall addexternStd(int, int);

And those are the mangled function name:

    
   
   
   
?add@@YAHHH@Z
?add@@YAHHHH@Z
           
?addstd@@YGHHH@Z
           
addextern
           
_addexternStd@8
           

你可能感兴趣的:(c,function,underscore,Microsoft,dll,compiler)