• dll动态链接库导出函数相关


      以前写导出函数时,都是在*.def中声明,但是ide自动生成的导出函数却是利用__declspect(dllexport)实现,那么我们自己在添加导出函数时,则需:

      1. 在需要导出的函数或类前添加__declspect(dllexport)即可。例如要导出函数void test(),则应该为:__declspect(dllexport) void test(){...}

      2. 步骤1导出的函数如果用pe工具查看导出函数,则看到的是"?test@@YAXXZ",产生这种现象的原因是我们以c++的方式导出,而c++有名字粉碎机制,C++编译器对程序员编写的函数名、变量名进行粉碎,粉碎后的名称将发生一定的变化。

      3,要使得导出函数的名字不发生变化,我们只需要遵循c的方式。只需要在导出时添加上关键字extern "C"即可(C必须大写)。故重新导出text函数的语句则为:extern "C" __declspect(dllexport) void test(){...}  ,重新用pe工具看导出函数则会发现成为了test,这真是所期望到的结果。

    ~~~

    附:关于def文件的语法:

      DEF文件的语法较为简单,区分大小写,使用几个特殊的关键字LIBRARY、DESCRIPTION、EXPROTS,使用分号,注释一行。下面是一个例子:

    LIBRARY "MyDll.dll" ;LIBRARY关键字后的字符串的值表示要导出的模块名
    DESCRIPTION “DEF文件实例” ;DESCRIPTION后字符串用来描述信息
    EXPORTS ;关键字后是要导出的数据信息
    test1 ;导出函数test1,没有声明序号
    test2 @2;声明序号为2,同时也导出函数名
    test3 @3 noname ;声明序号为3,但只导出序号,不导出函数

      对于导出序号的函数,在getprocaddress时,第二个参数可以是函数名也可以是序号。。so。。。一切ok

  • 相关阅读:
    (8)闭包函数(函数的传参方式)
    (7)名称空间和作用域
    (6)函数嵌套
    (5)函数对象
    (4)进阶函数(作用域、闭包、生成器、迭代器)
    (3)什么是函数(函数的定义、形参、实参、默认形参、可变长函数args kwargs,私有地址)
    (1)三元运算、字符编码
    (2)字符编码关系和转换(bytes类型)
    java技术学习网址收藏
    springmvc工作原理和环境搭建
  • 原文地址:https://www.cnblogs.com/rainduck/p/2238221.html
Copyright © 2020-2023  润新知