您的位置:首页 > 其它

VS2013生成dll及动态调用

2017-02-19 15:09 741 查看

VS2013生成dll及动态调用

标签(空格分隔): 学习笔记

一、VS2013生成dll文件(制造端)

1.1创建动态库的方法

创建动态库需要生成.dll和.lib两个文件

创建方法:

第一步:文件->新建->项目->win32控制台应用程序 项目名称:DLLGenerator

应用程序类型:DLL 附加项目:空项目



第二步:在创建的dll工程中编写自己需要编译成dll的函数cpp和头文件h

//cpp文件
int Add(int a, int b)
{
return a + b;
}

int Mul(int c, int d)
{
return c * d;
}


//h文件
int Add(int a, int b);
int Mul(int c, int d);


第三步:建立dll源文件dllmain.cpp,用来定义应用程序的入口点

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD  ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}


第四步,建立源文件Source.def

添加->新建->visual C++ ->模块定义文件(.def)

- 在此文件第一行引号中填你的项目名称即可,EXPORTS下面列出要生成的函数名称 格式:“名称 @序号”)

LIBRARY "DLLGenerator"
EXPORTS
Add @1
Mul @2


第五步:点击编译生成解决方案,显示生成完成。此时debug目
4000
录下就会出现.dll文件和.lib文件



第六步:将.h文件.dll文件.lib文件拷贝到同一个文件夹中。之后将这个文件夹就可以发送给任何人使用你编写的函数了。

二、VS2013动态使用动态链接文件(使用端)

2.1环境配置

和配置一般使用库的配置方法一样(如opencv),这里不做详细介绍,直接贴图;

第一步:新建工程,准备调用上面生成的dll文件



第二步:配置环境时,将vc++目录的包含目录,库目录分别包含上面生成的文件夹(.h,.dll,.lib)



第三步:连接器中加入lib文件



下面就可以自由的使用dll文件中的任何函数了。

三、VS2013静态使用动态链接文件(使用端)

由于很多时候我们没有lib文件和h文件,这时候上述方法就不能使用了,但是我们可以使用以下方式。

#include<iostream>
#include<Windows.h>
#include<time.h>
typedef int(*Dllfun)(int *, int);
using namespace std;
int main()
{
Dllfun maopao1;
HINSTANCE hdll;
hdll = LoadLibrary("E:\\matthewCode\\C&C++\\DLLtest\\DLLtest\\Debug\\dllOnlytest.dll");
if (hdll == NULL)
{
FreeLibrary(hdll);
}
maopao1 = (Dllfun)GetProcAddress(hdll, "maopao");
if (maopao1 == NULL)
{
FreeLibrary(hdll);
}
int a[10];
srand(time(0));
for (int i = 0; i<10; i++)
a[i] = rand() % 50;
maopao1(a, 10);
for (int i = 0; i<10; i++)
cout << a[i] << endl;

FreeLibrary(hdll);

}


四、dll文件的嵌套调用(使用端)

有时候我们调用的dll文件同时也调用了其他的dll文件,这时候我们还能顺利的调用这个dll文件吗?答案是肯定的。下面我们创建一个dll_1实现一个加法函数,在dll_2中我们调用dll_1中的加法函数,并产生一个新的乘法函数。上述两个过程都同第一小节的步骤得到dll文件,lib文件,h文件。

//dll_1
int Add(int a, int b)
{
return a + b;
}




//dll_2
#include<windows.h>
#include<mySubfunction.h>
int Mul(int a, int b)
{
int c;
c = Add(a , b);
return c * a;
}




同样的,我们心间一个工程3,分别调用dll_1,和dll_2的函数,环境的配置在这里省略不写(dll_1和dll_2的lib,h,dll文件都需要配置)。

工程3的代码如下:

#include <iostream>
#include "mySubfunction.h"
#include "J_Subfunction.h"
using namespace std;

int main()

{
int a = 1;
int b = 2;
int c;
int d;
c = Add(a, b);
d = Mul(a, b);
cout << c << endl;
cout << d << endl;
}


输入1,2返回值都是3说明所有dll的调用都测试通过。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: