前面我们介绍了dll的生成,大多数是使用extern "C"__declspec(dllexport)+函数名的方法导出dll。其实我们还有另一种方法来导出dll。

先介绍参考文献:

1.dll导出声明相关

2.VS2012中 C++创建DLL图解

3.DLL中导出函数的两种方式(dllexport与.def文件)

4 按序号而不是按名称从 DLL 导出函数

5.模块定义 (.Def) 文件

6.VS2010中 C++创建DLL图解    :介绍了如何定义def文件

7.MS VS只生成dll,不生成lib

8.VS中def文件对于生成dll和lib文件的作用

然后:

我们可以重点读一下3和6.即可。8中指出其实def文件的功能相当于extern “C” __declspec(dllexport)

我这里给出一个例子(点击下载)。证明了此处话的正确性。

贴出代码为:

testdll.h

#ifndef TestDll_H_
#define TestDll_H_extern "C"
{int Add(int plus1, int plus2);int substract(int a);
}#endif<span style="color:#ff0000;"><strong>
</strong></span>

.cpp

// NewDLL.cpp : 定义 DLL 应用程序的导出函数。
//#include "stdafx.h"
#include "testdll.h"
#include <iostream>
using namespace std;
int Add(int plus1, int plus2)
{int add_result = plus1 + plus2;return add_result;
}int substract(int a)
{return a;
}

调用dll:

#include <Windows.h>
#include <iostream>
#include "testdll.h"typedef int(*Func)(int, int);#pragma  comment(lib,"NewDLL.lib")int main()
{HMODULE Hdll = LoadLibrary("NewDLL.dll");if (Hdll != nullptr){Func f = Func(GetProcAddress(Hdll, MAKEINTRESOURCE(2)));if (f != nullptr){std::cout << "input 2 num:";int a, b;std::cin >> a >> b;std::cout << "result is " << Add(a, b);}else{std::cout << "connot find the function " << "add" << std::endl;}FreeLibrary(Hdll);}else{std::cout << "cannot load dll" << "NewDLL.dll" << std::endl;}system("pause");return 0;
}

def定义为:

LIBRARY "NewDLL"
EXPORTS
Add @2  NONAME
substract @1 NONAME 

注意:

1. 我们要将dll的头文件、lib文件都在调用的项目中指明。而且在生成dll的项目中def要指明

选择工程 > 属性中的链接器,然后找到"输入"这一项. 在 "模块定义文件" 中输入  ***.def
2. def文件中指明了函数的顺序,并且函数使用 c风格生成,这可以使我们在显式调用时直接使用函数名或者序号来调用。我们也可以为了节省内存,将函数名去掉,使用NONAME属性即可。可参考文献4.上面我们生成的dll就没有函数名,我们可使用dumpbin查看:

可以看到使用def,就可以基本不用改变头文件中的函数,我们手动的在def中指明。而且如果你的DLL是提供给VC用户使用的,你只需要把编译DLL时产生的.lib提供给用户,
它可以很轻松地调用你的DLL。但是如果你的DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。
因为VC++编译器对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
__declspec(dllexport) int __stdcall Add()
会转换为Add@0,这样你在VB中必须这样声明:
Declare Function Add Lib "DLLTestDef.dll" Alias "Add@0" () As Long
@后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式导出函数了。




使用Def文件导出dll相关推荐

  1. 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例

    在C++中,我们可以通过 __declspec(dllexport) 将函数导出为Dll中供其它程序使用,例如: _declspec(dllexport) int add(int a, int b); ...

  2. 使用def文件简化dll导出

    原文链接地址:http://www.cnblogs.com/TianFang/archive/2013/05/04/3059073.html 在C++中,我们可以通过 __declspec(dllex ...

  3. dll文件导出对应的lib文件

    在Windows平台上使用MSYS编译一些开源代码时经常只会生成DLL文件,而如果打算在VS中使用该DLL则需要有对应的LIB文件,下面以编译oRtp为例来看看如何从DLL文件中导出LIB文件. 需要 ...

  4. 用VC和MinGW导出dll的def和lib(a)文件

    为什么80%的码农都做不了架构师?>>> 原文地址:http://zhangyafeikimi.iteye.com/blog/404580 有了dll文件需要导出def文件:  pe ...

  5. 【转】extern “C“以及__declspec(dllexport) 讲解和def文件dll导出方法

    转自:https://blog.csdn.net/qing666888/article/details/41135245 一,__ declspec(dllexport): 将一个函数声名为导出函数, ...

  6. Dll (.a)(.def)文件之间的转换

    1. dll生成.def文件 一般安装完VS后可以搜索dumpbin.exe,拷贝到你的dll文件夹下, 执行命令行:dumpbin.exe /exports ***.dll > ***.def ...

  7. vs下.def文件使用无效问题

    相信用vs2005编译写.dll的工程的人一定对.def文件不陌生吧,.def文件是描述哪些要被导出来的函数. 格式如下: LIBRARY CMPNT2 -->dll名称 EXPORTS --- ...

  8. 动态库def文件的使用

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

  9. 实用技能 | OpenCV算法程序导出 DLL与调用演示

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:OpenCV学堂 很多时候OpenCV开发者完成来了一个 ...

最新文章

  1. 开源 java CMS - FreeCMS2.8 模板管理
  2. 使用lsof恢复进程打开的误删除文件
  3. Linux之设置http代理
  4. 【机器学习】机器学习模型验证,这3个 Python 包可轻松解决95%的需求!
  5. html 转换为cshtml,使用Html而不是csHtml
  6. 把zabbix图形整合至运维平台
  7. HTML5为输入框添加语音输入功能
  8. 【文本分类】 特征抽取之信息增益
  9. 试验Boost在Vxworks上的应用日记 二
  10. 平衡——职场小说《监控》推荐
  11. redis 实战系列(一)
  12. 4款开源的中文分词系统
  13. 火狐无法安装扩展_立即安装的前5个Firefox扩展
  14. 系统集成项目-管理工程师教程·一
  15. 2022年8月深圳CPDA数据分析师认证报名
  16. html中字体 楷体_(收藏)css怎么设置字体为楷体?
  17. linux查询文件夹大小
  18. 释放数据价值的真正法宝,数据要素市场化开发迫在眉睫
  19. 2022年--读书笔记
  20. 生产进度管理系统为制造管理提供较完善的解决方案

热门文章

  1. xcode8 升级后注释快捷键不能使用的解决方法
  2. Node — 第八天 (大事件项目接口实现二)
  3. 数据库系统原理(第二章关系数据库 )
  4. 数据库系统原理(第一章概述)
  5. BZOJ2301: [HAOI2011]Problem b(莫比乌斯反演)
  6. Kali Linux2018 上安装open-vm-tools实现虚拟机交互
  7. URAL1519 Formula 1 —— 插头DP
  8. mysql中如何判断某个字段是纯数字
  9. alibaba fastjson
  10. ASP.NET MVC 5 学习教程:控制器传递数据给视图