• DLL声明导出函数的两种方式


    DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport);另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

    但是使用__declspec(dllexport)和使用.def文件是有区别的。如果DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供其他程序如VB、delphi,以及.NET用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
    __declspec(dllexport) int __stdcallIsWinNT()
    会转换为IsWinNT@0,这样你在VB中必须这样声明:
    Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long
    @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。

    方式一:在函数声明中加上__declspec(dllexport),写在头文件中,例如:

    1 #ifndef LIB_H
    2 #define LIB_H
    3 extern "C" int __declspec(dllexport)add(int x, int y);
    4 #endif

    方法二:采用模块定义(.def) 文件声明,头文件代码如下:

    1 #ifndef LIB_H
    2 #define LIB_H
    3 int add(int x, int y);
    4 #endif

    同时新建一个.def文件,须注意不能在文件夹中直接新建DEF文件,必须用添加新项里的向导来完成,否则无法找到。.def文件的代码如下:

    1 LIBRARY libtest
    2 EXPORTS
    3 add @1

    .def文件的规则可以在MSDN中查到

    欢迎转载,请备注原始连接http://www.cnblogs.com/liuliuliu/p/3896922.html,并注明转载。

    作者bibibi_liuliu,联系方式395985239@qq.com

  • 相关阅读:
    HDU-1102 Constructing Roads ( 最小生成树 )
    POJ-1287 Networking ( 最小生成树 )
    HDU-1272 小希的迷宫 ( 并查集 )
    Java基本数据类型、关键字
    观察者模式
    Android系统启动过程分析
    Activity启动过程源码分析(Android 8.0)
    Okhttp解析—Okhttp概览
    Okhttp解析—Interceptor详解
    Okhttp源码分析--基本使用流程分析
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/3896922.html
Copyright © 2020-2023  润新知