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

  • 相关阅读:
    (C#基础) byte[] 之初始化, 赋值,转换。
    System.IO.IOException: The handle is invalid.
    .NET 自动内存管理(垃圾收集GC)
    Inconsistent accessibility
    有用的网址
    dw添加emmet
    行内标签,怎么取消两个标签中间的距离
    2016.6.2近日学习计划
    HTML5 input placeholder 颜色修改示例
    加入收藏和设为首页
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/8973294.html
Copyright © 2011-2022 走看看