模块定义文件.def

一作用

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

链接器阶段可以使用 /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 __stdcallIsWinNT()

会转换为[email protected],这样你在VB中必须这样声明:

Declare Function IsWinNT Lib "my.dll" Alias "[email protected]" () As Long

@的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。

EXPORTS后面的数可以不给,系统会自动分配一个数。对于VB、PB、Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。

使用

例1:我们用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

例2:首先创建 一个DLL程序,.cpp中

int __stdcall Sub(int numa, int numb)
{
        return (numa - numb);
}

然后创建一个.def的文件,在里面加上

;DllTestDef.lib : 导出DLL函数
;作者:----
LIBRARY DllTestDef
EXPORTS 
Add @ 1
Sub @ 2

最后创建一个测试程序:.cpp文件如下:
#include <iostream>
#include <windows.h>

using namespace std;

typedef int (__stdcall *FUN)(int, int);
HINSTANCE hInstance;
FUN   fun;

int main()
{
       hInstance =
LoadLibrary("DLLTestDef.dll");
       if(!hInstance)
           cout <<
"Not Find this Dll" << endl;
       fun = (FUN)GetProcAddress(hInstance,
MAKEINTRESOURCE(1));
       if (!fun)
       {
              cout
<< "not find this fun" << endl;
       }
       cout << fun(1, 2) <<
endl;
       FreeLibrary(hInstance);
       return 0;
}

说明:
.def文件的规则为:

  (1)LIBRARY语句说明.def文件相应的DLL;

  (2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);

  (3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。

 

模块定义文件.def

时间: 2024-10-12 09:03:52

模块定义文件.def的相关文章

DLL中__declspec(dllexport)和.def(模块定义文件)定义导出函数的一点区别

原想是不在DLL中使用.def文件的,直接在需要导出的函数前加__declspec(dllexport)修饰.但在是要导出STDAPI __declspec(dllexport) DllGetClassObject的时候,就提示"warning C4518: “__declspec(dllexport ) ” : 此处遇到意外的存储类或类型说明符:被忽略"(我用的是vc.net 2003). STDAPI这个宏扩展出来是extern "C" HRESULT __st

nodejs第三天(核心模块与文件模块,核心模块和文件模块引入的区别,从模块外部访问模块内部,使用exports对象,npm包管理工具package.json文件,模块对象属性,将模块定义分类,npm发布流程,安装淘宝镜像,模块的管理)

核心模块与文件模块 ndejs是一个js运行环境,是一个平台.nodejs基于操作系统,封装了一些功能,http,tcp,udp,i/o模块,path,fs,stream等等 通过nodejs内置的模块,他们就称为核心模块.(他们都是nodejs内置的)http,fs,path等 文件模块:只要写一个js文件,每一个文件都是模块 .(自己写的js文件都被称为文件模块) 核心模块和文件模块引入的区别 核心模块有环境变量做调度 文件模块需要给出文件路径 注意:核心模块是nodejs内置的一些功能模块

模块运用,文件搜索

'''面向过程编程 核心过程二字,过程指的是解决问题的步骤,即先干什么.再干什么.然后干什么... 基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式 优点 复杂的问题流程化.进而简单化 缺点 扩展性极差 ''' # 接收用户输入用户名,进行用户名合法性校验,拿到合法的用户名def check_user(): while True: name = input('username>>').strip() if name.isalpha(): return name else: pr

python下通过os模块和shutil模块进行文件处理方式

python下通过os模块和shutil模块进行文件处理方式 得到当前工作目录路径:os.getcwd() 获取指定目录下的所有文件和目录名:os.listdir(dir) 删除文件:os.remove(file) 删除多个目录:os.removedirs(r"/home") 检测路径是否为文件:os.path.isfile(path) 检测路径是否为目录:os.path.isdir(path) 判断是否为绝对路径:os.path.isabs(path) 检测路径是否存在:os.pat

CMD (sea.js)模块定义规范

转自http://www.cnblogs.com/hongchenok/p/3685677.html CMD 模块定义规范 在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范中,一个模块就是一个文件.代码的书写格式如下: define(factory); define Function define 是一个全局函数,用来定义模块. define d

Sea.js学习3——Sea.js的CMD 模块定义规范

在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范中,一个模块就是一个文件.代码的书写格式如下: define(factory); define Function define 是一个全局函数,用来定义模块. define define(factory) define 接受 factory 参数,factory 可以是一个函数,也可以是一个对象或字

AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法

AMD 模块 AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一个可用的模块化 JavaScript 的解决方案. AMD 模块格式本身是一个关于如何定义模块的提案,在这种定义下模块和依赖项都能够异步地进行加载.它有很多独特的优势,包括天生的异步及高度灵活等特性,这些特性能够解除常见的代码与模块标识间的那种紧密耦合.目前它已经被很多项目所接纳,包括jQuery(1.7). RequireJS RequireJS是一个工具库,主

python-linecache模块读取文件用法

python-linecache模块读取文件用法详解 linecache模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行. 1.linecache.getlines(filename) 从名为filename的文件中得到全部内容,输出为列表格式,以文件每行为列表中的一个元素,并以linenum-1为元素在列表中的位置存储 2.linecache.getline(filename,lineno) 从名为filename的文件中得到第lineno行.这个函数从不

AMD模块定义规范

AMD 即Asynchronous Module Definition,中文名是"异步模块定义"的意思.它是一个在浏览器端模块化开发的规范,服务器端的规范是CommonJS.   模块将被异步加载,模块加载不影响后面语句的运行.所有依赖某些模块的语句均放置在回调函数中. AMD 是 RequireJS 在推广过程中对模块定义的规范化的产出. define() 函数 AMD规范只定义了一个函数 define,它是全局变量.函数的描述为: define(id?, dependencies?