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

  • 相关阅读:
    数据结构与算法之PHP实现二叉树的遍历
    数据结构与算法之二叉树的基本概念和类型
    JS实现下拉单的二级联动
    数据结构与算法之PHP实现队列、栈
    数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)
    数据结构与算法之数组、链表、队列、栈
    大型网站架构总结
    MySQL分库分表
    C基础 那些年用过的奇巧淫技
    C高级 服务器内核分析和构建 (一)
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/3896922.html
Copyright © 2011-2022 走看看