您的位置:首页 > 其它

生成dll文件与显式调用dll文件

2017-02-19 16:43 274 查看
在C++中有dll、lib和h头文件,这些文件各自有各自的作用。对于调试代码到生成一个可执行文件的过程中,lib和h文件在编译的时候用到,dll在可执行文件执行的时候用到。下面就写一下dll的生成方式和显式调用的例子和流程。

一、生成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函数返回函数的地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: