VS2013生成dll及动态调用

  • Post author:
  • Post category:其他


VS2013生成dll及动态调用

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


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

1.1创建动态库的方法

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

创建方法:

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

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

微信截图_20160831174710.png-37kB

第二步:在创建的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目录下就会出现.dll文件和.lib文件

微信截图_20160831175516.png-28kB

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

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

2.1环境配置

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

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

微信截图_20160831175940.png-15.4kB

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

微信截图_20160831180041.png-42kB

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

微信截图_20160831180058.png-11.7kB

下面就可以自由的使用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;
}

微信截图_20160901102606.png-14.9kB

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

微信截图_20160901102648.png-17.4kB

同样的,我们心间一个工程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的调用都测试通过。

微信截图_20160901103004.png-19.2kB



版权声明:本文为liu_matthew原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。