回顾一下C++ 编写DLL

项目模版使用Win32工程创建的dll项目

一、原始代码

使用depends查看导出函数

二、不同编译方式区别

C方式编译(extern "C"):

  1. __stdcall调用约定:输出名称在原名称前加一下划线,后面再加上一个“@”和其参数的总字节数(_原名称@参数总字节数),如名称int Func_C_stdcall(int a,int b)输出为_Func_C_stdcall@8;
  2. __cdecl调用约定:与原名称相同,如名称int Func_C_cdecl(int a,int b)输出还是为Func_C_cdecl;

C++方式编译(extern "C++"):

__stdcall调用约定:

  1. 输出名称以“?”开始,后跟原名称;
  2. 原名称后再跟“@@YG”,后面再跟返回值代号和参数表代号,代号表示如下:
    X--void ,
    D--char,
    E--unsigned char,
    F--short,
    H--int,
    I--unsigned int,
    J--long,
    K--unsigned long,
    M--float,
    N--double,
    _N--bool,
    ...
    PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复;
  3. 参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。如名称int Func_CPP_stdcall(int a,int b)编译后的输出名称为?Func_CPP_stdcall@@YGHHH@Z。

__cdecl调用约定:与_stdcall调用约定基本一致,只是参数表的开始标识由上面的“@@YG”变为“@@YA”。如名称int Func_CPP_cdecl(int a,int b)编译后输出名称为?Func_CPP_cdecl@@YAHHH@Z。
编译C文件和编译CPP文件,不需加extern "C"和extern "C++",因为编译C文件当然默认的是extern "C",而编译CPP文件则默认的是extern "C++"。

第二部分转自:https://blog.csdn.net/beanjoy/article/details/9136127

posted @ 2018-04-30 11:52  zhaogaojian  阅读(282)  评论(0编辑  收藏  举报