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

  • 相关阅读:
    .net 2.0 使用linq
    重建索引解决mssql表查询超时的问题
    倾斜摄影自动化建模成果的数据组织和单体化
    cesium导入3D模型(obj转gltf)
    github
    JSP转发和重定向的区别
    mysql压缩版的安装教程
    JSP内置对象
    运行jsp常犯的错误
    递归的几个demo
  • 原文地址:https://www.cnblogs.com/rainduck/p/2238221.html
Copyright © 2011-2022 走看看