Dll的导入导出(export与import)

参考:http://blog.csdn.net/ooyyee11/article/details/6894436

一个lib提供了许多的资源,像类、函数、结构定义等:

 

我们在开发环境中搜索 *.lib,会发现很多lib库,像 Winmm.lib

当我们使用timeGetTime() 时,

1. 需要在 链接器--〉输入 中添加  Winmm.lib,

2. 同时,需要包括头文件:mmsystem.h

 

基于上面这个,我们查看timeGetTime在头文件中定义:

WINMMAPI DWORD WINAPI timeGetTime(void);

把宏翻译之后是:

 __declspec(dllimport) DWORD __stdcall  timeGetTime(void);

这个就是我们常见的引入的定义了

 

1. 一般我们定义导出函数或类的时候,都会使用类似的一组宏:

#ifdef  _BASEFUNC_EXPORT_
#define  BASE_API   __declspec(dllexport)
#else
#define  BASE_API   __declspec(dllimport)
#endif

 

2. 在头文件中是用:

class BASE_API CJCJMsgCmd_PrintRoadMap : public CJCJMsgCmd 
{

...

 

3. 在dll编译时,添加预编译选项  _BASEFUNC_EXPORT_,这样 BASE_API 相当于__declspec(dllexport)

4. 在使用dll的工程中,BASE_API 相当于__declspec(dllimport)

 

 

下面为转载的一篇内容,里面详细解释了与def文件的关系:(.def文件较适用非MFC程序调用DLL)

http://blog.chinaunix.net/uid-23929779-id-3936638.html

    在C++中自建的dll定义的API,是不是应该在.def中做一个声明。 MSDN中的名词解释模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时,.def 文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。也可以将__declspec(dllexport) 用作指定导出函数的手段。在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用 .def 文件。如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。

      通俗解释: 在VC++中,生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加 __declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果 DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供其他程序如 VB、delphi,以及.NET 用户使用的,那么会产生一个小麻烦。因为VC++对于 __declspec(dllexport)声明的函数会进行名称转换,如下面的函数: __declspec(dllexport) int __stdcall IsWinNT() 会转换为IsWinNT@0,这样你在VB中必须这样声明: Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。 EXPORTS后面的数可以不给,系统会自动分配一个数。对于VB、PB、 Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。例子:我们用VC6.0制作一个dll,不使用.def文件,在头文件中这样写 #ifndef LIB_H #define LIB_H extern "C" int _declspec(dllexport)add(int x,int y); #endif

       如果是.def文件,可以这样 LIBRARY "xxx_dll" EXPORTS add PRIVAT

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数组函数 Pos() CloseChannel() PrintSetFont() lowerBound() Replace() ExeclRemote() PrintSetSpacing() UpperBound() Right() GetDataDDEOrigin() PrintSetup() RightTrim() GetRemote() PrintText() Blob(大二进制对象)函数 Space() OpenChanner() PrintWindth() Blob() Trim() RespondRemote() PrintX() BlobEdit() Upper() SetRemote() PrintY() BlobMid() StartHotLink() Len() 系统与环境函数 StopHotLink() 窗口操作函数 String() Clipboard() Close() CommandParm() DDE服务器函数 CloseWithReturn() 数据类型检查与转换函数 DoScript() GetCommandDDE() Open() Asc() GetApplication() GetCommandDDEOrigin() OpenSheet() Char() GetEnvironment() GetDataDDE() OpenSheetWithParm() Dec() GetFocus() GetDataOrigin() OpenWithParm() Double() Post() RespondRemote() Integer() ProfileInt() SetDataDDE() 国际化函数 Long() ProfileString() StartServerDDE() IsAllArabic() Real() Restart() StopServerDDE() IsAllHebew() Date() Run() IsAnyArabic() DateTime() Send() 文件操作函数 IsAnyHebrew() IsNumber() SetProfileString() FileClose() IsArabic() IsTime() ShowHelp() FileDelete() IsArabicAndNumbers() Time() SignalError() FileExists() IsHebrew() Yield() FileLength() IsHebrewAndNumbers() 数值计算函数 FileOPen() Reverse() Abs() 日期、时间函数 FileRead() ToAnsi() Ceiling() Day() FileSeek() ToUnicode() Cos() DayName() FileWrite() Exp() DayNumber() GetFileOpenName() 其他函数 Fact() DaysAfter() GetFileSaveName() Beep() Int() Hour() ClassName() Log() Minute() 库管理函数 DebugBreak() logTen() Month() LibraryCreate() IntLow() Max() Now() LibraryDelete() IsValid() Min() RelativeDate() LibraryDirectory() KeyDown() Mod() RelativeTime() LibraryExport() MessageBox() Pi() Second() LibraryImport() PixelsToUnits() Rand() Today() PopulatError() Randomize() Year() 打印函数 RGB() Round() Print() SetNull() Sign() 注册(Registry)函数 PrintBitmap() SetPointer() Sin() RegistryDelete() PrintCancel() SignalError() Sqrt() RegistryGet() PrintClose() UnitsToPixels() Tan() RegistryKeys() PrintDataWindow() Truncate() RegistrySet() PrintDefineFont() RegistryValues() PrintLine() 字符串操作函数 PrintOpen() Fill() 定时函数 PrintOval() Left() CPU() PrintPage() LeftTrim() Idle() PrintRect() Lower() Timer() PrintRoundRect() Match() PrintScreen() Mid() DDE客户函数 PrintSend()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值