模块定义 (.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文件拷贝到测试工程目录下。

最新文章

  1. Kafka:主要参数详解(转)
  2. 阿里云CentOS7系列一 -- 安装JDK7的方法.
  3. string相关总结
  4. zepto - scrollLeft
  5. Hearthstone-Deck-Tracker项目的编译
  6. css读书笔记2:css工作原理
  7. 笔记一、Git服务器【转】
  8. BZOJ 1787 紧急集合
  9. VS2015接口智能提示少了异常信息 怎么破~
  10. 痛并快乐的造轮子之旅:awk访问数据库之旅
  11. Import Statements 导入语句
  12. Jenkins 发布后自动创建git tag
  13. python 标准库 -- configparser
  14. java面向对象编程(七)--四大特征之多态
  15. ZooKeeper-3.3.4集群安装配置
  16. 软件工程(GZSD2015) 第二次作业进度
  17. Linux 操作系统文件略解
  18. 板载CAN的树莓派扩展板Strato Pi CAN
  19. 前m大的数(哈希入门)&amp;&amp;sort
  20. Vue2学习笔记:键盘事件

热门文章

  1. Centos610安装redis
  2. 「CQOI2011」动态逆序对
  3. 本周总结(19年暑假)—— Part6
  4. uchome后台系统配置分析
  5. MyBatis模糊查询异常: &#39;%${}&#39;&#39;读取jdbc属性
  6. 二 sql语句,常用字段数据类型
  7. java set的线程安全
  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:表示一个危险动作的按钮操作
  9. 一个Java的小问题
  10. Linux centosVMware df命令、du命令、磁盘分区