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

原文地址:https://www.cnblogs.com/rainduck/p/2238221.html