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

  • 相关阅读:
    快速入门 ASP.NET MVC
    关于ASP.NET中由于无法创建应用程序域,因此未能执行请求解决方案
    Microsoft ASP.NET MVC Beta IIS6 部署
    弹窗显示正在执行的任务
    多线程加深理解_进攻五个城
    反射与配置文件简单使用
    C#中MemberwiseClone的理解
    C# App.config 自定义 配置节 报错“配置系统未能初始化” 解决方法
    多线程信号源的理解
    日志的记录
  • 原文地址:https://www.cnblogs.com/rainduck/p/2238221.html
Copyright © 2011-2022 走看看