zoukankan      html  css  js  c++  java
  • 回顾一下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

  • 相关阅读:
    团队项目
    四则运算
    关于软件工程的问题
    自我介绍
    各种排序
    2017年03月14日 新模块投产日记
    第一发和技术无关的博客
    分享一款好用的PHP下ID混淆插件
    批量抓取cisco设备配置脚本编写(expect/sed/awk/shell)
    ntp/heartbeat/postfix/dns故障处理记录
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/8973294.html
Copyright © 2011-2022 走看看