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

  • 相关阅读:
    Composite in Javascript
    Model Validation in Asp.net MVC
    HttpRuntime.Cache vs. HttpContext.Current.Cache
    Controller Extensibility in ASP.NET MVC
    The Decorator Pattern in Javascript
    The Flyweight Pattern in Javascript
    Model Binding in ASP.NET MVC
    Asp.net MVC
    jQuery Ajax 实例 全解析
    ASP.NET AJAX入门系列
  • 原文地址:https://www.cnblogs.com/rainduck/p/2238221.html
Copyright © 2011-2022 走看看