生成dll文件与显式调用dll文件
2017-02-19 16:43
274 查看
在C++中有dll、lib和h头文件,这些文件各自有各自的作用。对于调试代码到生成一个可执行文件的过程中,lib和h文件在编译的时候用到,dll在可执行文件执行的时候用到。下面就写一下dll的生成方式和显式调用的例子和流程。
一、生成dll文件。
看以下代码:
1、在工程的设置中,配置属性->常规->配置类型,改成动态库(.dll)的形式。这样编译就可以生成dll文件。
2、在debug下编译生成的dll在使用的时候只能在debug下调用,release版本下编译生成的dll只能在release下调用。
3、生成dll的编译器的版本和调用dll的工程所用的编译器的版本尽量一致,不然有时候这个问题很难解决。
编译成功后:在相应的工程目录下就可以看到生成的dll文件
![](https://img-blog.csdn.net/20170219164924738)
dll文件的名字和工程名字一致。
二、dll的显式调用
调用一中生成的dll工程代码如下:
代码的运行结果如下:
![](https://img-blog.csdn.net/20170219165022391)
证明dll中的add和mul函数被调用了。
注意事项:
1、生成的dll必须放在相应的路径下,不然会找不到dll。
2、debug版本的dll必须在debug版本工程下被调用。
三、相关语句解释:
1、生成dll的声明:
extern "C"XX1 __declspec(dllexport)FounNmae(XX2
a);
XX1是生成的dll中需要调用的函数的返回值类型,FounNmae是生成的dll中需要调用的函数的名字,XX2
a分别是dll中需要调用的函数的参数类型和名字。要生成dll的工程中必须加上这句话。dll中后面需要调用的函数都需要声明下。
2、调用dll过程中:
char* DllName -- 为存放你需要调用的dll的路径。
HMODULEDLL=LoadLibraryA(DllName); --
获得dll的句柄,其中DLL是定义的一个句柄的名字,LoadLibraryA函数返回一个dll的柄。HMODULE是定义句柄的关键字,使用此关键字必须在#include <window.h>,即包含window头文件。
typedefXX1(*Name)(XX2); --
XX2为dll需要调用函数的参数类型列表,XX1为dll需要调用函数的返回值。这个什么是为了后面获取dll中函数的地址做准备。
Namename
= Name(GetProcAddress(DLL, "name")); -- Name为上述的声明,name为dll需要调用的函数的名称,DLL为dll的句柄。GetProcAddress函数返回函数的地址。
一、生成dll文件。
看以下代码:
#include <iostream> using namespace std; //生成dll文件声明 extern "C" int __declspec(dllexport)add(int a, int b); extern "C" int __declspec(dllexport)mul(int a, int b); int add(int a, int b) { cout << "加法函数被调用" << endl; return (a+b); } int mul(int a, int b) { cout << "乘法函数被调用" << endl; int data = a*b; return data; }注意事项:
1、在工程的设置中,配置属性->常规->配置类型,改成动态库(.dll)的形式。这样编译就可以生成dll文件。
2、在debug下编译生成的dll在使用的时候只能在debug下调用,release版本下编译生成的dll只能在release下调用。
3、生成dll的编译器的版本和调用dll的工程所用的编译器的版本尽量一致,不然有时候这个问题很难解决。
编译成功后:在相应的工程目录下就可以看到生成的dll文件
dll文件的名字和工程名字一致。
二、dll的显式调用
调用一中生成的dll工程代码如下:
#include <iostream> #include<Windows.h> using namespace std; //所调用dll文件的存放路径 const char* DllName="dllCreate.dll"; //获取dll句柄 HMODULE dllCreat=LoadLibraryA(DllName); //类型声明 typedef int(*ADD)(int, int); typedef int(*MUL)(int,int); //获取函数地址 ADD add = ADD(GetProcAddress(dllCreat, "add")); ADD mul = ADD(GetProcAddress(dllCreat, "mul")); int main() { int a=10; int b=10; cout << add(a, b)<< endl; cout << mul(a, b)<< endl; cin.get(); return 0; }
代码的运行结果如下:
证明dll中的add和mul函数被调用了。
注意事项:
1、生成的dll必须放在相应的路径下,不然会找不到dll。
2、debug版本的dll必须在debug版本工程下被调用。
三、相关语句解释:
1、生成dll的声明:
extern "C"XX1 __declspec(dllexport)FounNmae(XX2
a);
XX1是生成的dll中需要调用的函数的返回值类型,FounNmae是生成的dll中需要调用的函数的名字,XX2
a分别是dll中需要调用的函数的参数类型和名字。要生成dll的工程中必须加上这句话。dll中后面需要调用的函数都需要声明下。
2、调用dll过程中:
char* DllName -- 为存放你需要调用的dll的路径。
HMODULEDLL=LoadLibraryA(DllName); --
获得dll的句柄,其中DLL是定义的一个句柄的名字,LoadLibraryA函数返回一个dll的柄。HMODULE是定义句柄的关键字,使用此关键字必须在#include <window.h>,即包含window头文件。
typedefXX1(*Name)(XX2); --
XX2为dll需要调用函数的参数类型列表,XX1为dll需要调用函数的返回值。这个什么是为了后面获取dll中函数的地址做准备。
Namename
= Name(GetProcAddress(DLL, "name")); -- Name为上述的声明,name为dll需要调用的函数的名称,DLL为dll的句柄。GetProcAddress函数返回函数的地址。
相关文章推荐
- 关于“无法显式调用运算符或访问器”的问题以及Reflector反编译dll文件再生成dll文件的问题
- VB.NET 生成DLL文件 调用DLL文件
- 如何编译生成dll文件以及如何调用dll文件
- C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件
- matlab的m文件生成dll,c调用
- matlab生成VS可调用的dll文件
- 使用VS2012生成和调用DLL文件
- 64位win7下vc2010如何调用matlab2012a中生成的dll文件
- 在vs中用C的编程方式生成.dll文件并且动态、静态调用dll中的函数
- 动态链接库的生成(dll)和 动态链接库隐式and显式调用
- Labwindows/CVI程序调用C#生成的Dll文件
- VC++和Matlab混合编程(在VC中调用将.m文件生成的DLL)
- C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件
- windows 10(64位)下实现vs20120C++调用matlab r2014a编写的m文件生成的.dll,.lib,.h文件
- Delphi 使用之dll文件生成与调用
- vc制作DLL文件与调用DLL文件的方法
- c# 调用 .cs 生成的 dll 文件
- PB8调用使用C++与C#分别编写生成解压缩带有密码的zip压缩文件的动态链接库dll(部分内容转自互联网)
- Qt调用qt生成的dll 显式和隐式(静态动态)
- VS2010 VB如何生成DLL文件,调用DLL