DLL导出、导入

最近看了些dll相关的东西,由于对dll导出、导入接口、变量等不是很了解,就查了些相关资料。这儿先作一个简单的总结,后面转了几篇文章,讲的更详细些。
      1、__declspec(dllimport)   与__declspec(dllexport)
              __declspec(dllexport)声明一个导出,用于需要导出的dll中。
              __declspec(dllimport)声明一个导入,一般用于使用dll的exe中。
              声明导入时,即声明要使用别人的某个导出时,__declspec(dllimport)是可选的,但是,为使导入的可执行文件能够访问DLL 的公共数据符号和对象,必须使用 __declspec(dllimport)
              对于dll和客户端应用程序可以使用相同的头文件,可以使用预处理符合来区别宏的定义,如:
#ifdef _EXPORTING
   #define CLASS_DECLSPEC    __declspec(dllexport)
#else
   #define CLASS_DECLSPEC    __declspec(dllimport)
#endif

class CLASS_DECLSPEC CExampleA : public CObject{ ... class definition ... };
      2、__declspec(dllexport) 与 .def文件
        __declspec(dllexport) 与 .def文件都可以实现导出的目的,所以,使用了__declspec(dllexport)就可以免去写.def文件的痛苦。
但是,许多导出指令(如序号、NONAME 和 PRIVATE)只能在 .def 文件中创建,并且必须使用 .def 文件来指定这些属性。不过,在 .def 文件的基础上另外使用 __declspec(dllexport)不会导致生成错误。
如果DLL是提供给VC++用户使用的,只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数: 

    __declspec(dllexport) int __stdcall IsWinNT() 

    会转换为IsWinNT@0,这样你在VB中必须这样声明: 

    Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long 

    @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值