模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 __declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 需要 .def 文件。.def 文件必须至少包含下列模块定义语句:

  • 文件中的第一个语句必须是 LIBRARY 语句。此语句将 .def 文件标识为属于 DLL。LIBRARY 语句的后面是 DLL 的名称。链接器将此名称放到 DLL 的导入库中。

  • EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。通过在函数名的后面加上 @ 符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。使用符号时外部调用程序可以使用函数名称和序号加载函数。

步骤:

1. 新建一个win32控制台项目,File->New->Project,选择Win32控制台项目,在“应用程序设计”中选择"Dll","空项目"

2.在工程中添加一个.cpp文件,本文为DllDefTest.cpp,并输入如下代码:

int __stdcall Add(int numa, int numb)
    {
       return (numa + numb);
    }

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

3.在工程中添加一个.def文件,本文为DllDefTest.def,输入如下代码:

LIBRARY DllDefTest
  EXPORTS 
  Add @ 1
  Sub @ 2

也可以为如下内容,即函数名称不包括序号

LIBRARY DllDefTest
  EXPORTS  
  Add
  Sub

这两者的区别只是在外部导入函数时有所不同,下面会具体介绍。

4.编译工程,就可以在Debug中看到DllDefTest.lib和DllDefTest.dll。

到此DLL的制作已经完成,下面给出一个测试程序,看看如何使用该Dll。

建立一个win32控制台项目,在“应用程序设计”中选择“控制台应用程序”和“空项目”,在工程中添加test.cpp文件,并输入如下代码:本文给出的测试程序是采用显示链接的方式调用该DLL的,当然也可以采用隐式链接的方式调用,如果采用隐式链接必要要有头文件。

#include <iostream>
  #include <windows.h>

using namespace std;

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

int main()
  {
     hInstance = LoadLibrary("DllDefTest.dll");
     if(!hInstance)
     cout << "Not Find this Dll" << endl;
     fun = (FUN)GetProcAddress(hInstance, "Add");

//当在Def文件中指定函数序号时,可以通过序号导出,否则只能通过函数名称导出
     //fun = (FUN)GetProcAddress(hInstance, MAKEINTRESOURCE(2));

if (!fun)
    {
       cout << "not find this fun" << endl;
    }
    cout << fun(1, 2) << endl;
    FreeLibrary(hInstance);
    return 0;
 }

注意,需要将刚才生成的DllDefTest.dll文件拷贝到测试工程目录下。

使用Def文件导出Dll文件的更多相关文章

  1. lib文件和dll文件

    一. 简介 1.1 C++两种库文件 lib包含了函数所在的dll文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的dll提供,称为动态链接库dynamic link library. ...

  2. LIB文件和DLL文件的作用

    (1)lib是编译时需要的,dll是运行时需要的.如果要完成源代码的编译,有lib就够了.如果也使动态连接的程序运行起来,有dll就够了.在开发和调试阶段,当然最好都有.(2)一般的动态库程序有lib ...

  3. 关于vs的lib文件和dll文件

    一.LIB文件概念 一个lib文件是obj文件的集合.当然,其中还夹杂着其他一些辅助信息,目的是为了让编译器能够准确找到对应的obj文件 二.与DLL的区别 (1)lib是编译时需要的,dll是运行时 ...

  4. VC2010 利用 def 文件生成 dll 文件的方法

    近期有个需求,要生成一个dll 文件.文件里的函数都是採用 stdcall 函数调用约定,可是不希望函数名被修饰(add 被修饰成 add@8). 这时就要用def 文件了. 比方我有以下两个函数: ...

  5. 如何利用.snk文件生成DLL文件中的Publickeytoken

    1.在该路径下C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin查找是否有sn.exe. 没有的话,从网上下载,注意需要的版本. 2.打开c ...

  6. winmd文件和dll文件的区别

    今天在研究一个二维码项目,用到一个第三方组件 ZXing,因为做的是Windows应用商店程序,应用商店程序是可以引用winmd文件也可以引用dll文件,但是这两种文件ZXing都提供了,最后和同事讨 ...

  7. 编辑IL文件 修改DLL文件

    本文章只是技术探讨,学习,技术上的研究而已.请支持正版. 如:KS.Gantt.DLL 为例 使用ILSpy反编译 工具 利用ildasm反编译 KS.Gantt.dll  生成IL中间代码 一般会生 ...

  8. Flash cs6 如何从FLA 文件导出sound文件

    Flash. How to export sound from the FLA file extract sound from a fla 第一个是图文教程,在下面还有"watch vide ...

  9. 类库从自带的配置文件中获取信息(DLL文件 获取 DLL文件自带的配置信息) z

    http://blog.csdn.net/shuaishifu/article/details/19602059 类库调用自身所带的配置文件中的配置信息,而不是读取应用程序所带的配置信息.代码如下: ...

随机推荐

  1. JS - 处理浏览器兼容之 event

    function test(e){ var event = e || windows.event   //  IE : windows.event  ,非IE : e }

  2. Linux centosVMware NFS exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp

    一.exportfs命令 常用选项 -a 全部挂载或者全部卸载 -r 重新挂载 -u 卸载某一个目录 -v 显示共享目录 以下操作在服务端上 vim /etc/exports //增加 /tmp/ 1 ...

  3. SpringSecurity-权限关联与控制

    6.3 服务器端方法级权限控制 在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制.Spring Security在方法的权限控制上 支持三种类型的注解,JSR-250 ...

  4. Lesson 13 The search for oil

    What do oilmen want to achieve as soon as they strike oil? The deepest holes of all are made for oil ...

  5. Django线上部署代码修改失效问题

    记一次django项目的线上部署维护问题,django+nginx 关于nginx反向代理服务器的介绍这里有一篇博客介绍的比较好:nginx的相关介绍 以及当一次客户端请求发出后,uwsig以及uWS ...

  6. 吴裕雄--天生自然MySQL学习笔记:MySQL 安装

    所有平台的 MySQL 下载地址为: MySQL 下载:https://dev.mysql.com/downloads/mysql/ 注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足 ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:表单控件状态

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 棋盘 || 状压DP

    题意:有一个n*m的棋盘(n,m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子,使得任意两个棋子不相邻(每个棋子最多和周围4个棋子相邻).求合法的方案总数. 思路:对于每一行,如果把没有棋子的 ...

  9. 剑指offer 把数组排成最小的数 atoi和itoa,pow

    pow(x,y)在#include<math.h>文件中,计算x的y次方. C++引入头文件:#include <stdlib.h> 或者 #include <cstdl ...

  10. Java图形与文本(18)

    实例018  旋转图形 实例说明 本实例演示在Java中绘制图形时,如何对图形进行旋转.运行程序,单击窗体上的“顺时针”按钮,可以将图形顺时针旋转,效果如图1.18所示,用户还可以通过单击“逆时针”和 ...