使用Def文件导出dll
来源:互联网 发布:sql server 2000卸载 编辑:程序博客网 时间:2024/05/01 06:53
前面我们介绍了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
- 使用 DEF 文件导出 DLL
- 使用Def文件导出dll
- [DLL]使用def文件从dll导出
- 使用Def文件导出Dll文件
- dll 导出文件不能使用def文件
- 使用Def文件导出Dll文件
- 使用Def文件导出Dll文件
- 使用Def文件导出Dll文件
- 使用def文件简化dll导出
- 使用def文件简化dll导出
- 使用def文件简化dll导出
- 使用def文件简化dll导出
- 用.DEF文件导出DLL中的函数
- 用.DEF文件导出DLL中的函数
- DEF文件中导出DLL函数
- def文件 导出dll重载函数
- 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例
- 经典算法——最长回文子序列
- 栈与队列简单剖析
- Spark如何使用Akka实现进程、节点通信的简明介绍
- WPF 通讯
- 简单用法小结
- 使用Def文件导出dll
- 斗地主技巧
- iOS自定义转场动画(下)
- Myeclipse10x破解方法
- Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置
- NAO连接设置
- lib 和 dll 的区别、生成以及使用详解
- Cookie的使用
- Android Gradle Plugin指南(四)——测试