int __stdcall Add(int numa, int numb)
{
}
int __stdcall Sub(int numa, int numb)
{
}
;DllTestDef.lib : 导出DLL函数
;作者:----
LIBRARY DllTestDef
EXPORTS
Add @ 1
Sub @ 2
#include
#include
using namespace std;
typedef int (__stdcall *FUN)(int, int);
HINSTANCE hInstance;
FUN
int main()
{
}
说明:
. def文件的规则为:
(1)LIBRARY语句说明. def文件相应的 DLL;
(2) EXPORTS语句后列出要导出函数的名称。可以在. def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);
(3). def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。
MSDN中的名词解释
模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时,.def 文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。也可以将 __declspec(dllexport)
如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。
通俗解释:
在VC++中,生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供其他程序如VB、delphi,以及.NET
用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
例子:我们用VC6.0制作一个dll,不使用.def文件,在头文件中这样写
#ifndef LIB_H
#define LIB_H
extern "C" int _declspec(dllexport)add(int x,int y);
#endif
如果是.def文件,可以这样
LIBRARY
EXPORTS
add