vs2017 中简单创建 dll 和 显示引用dll文件

标签: c++  dll

参考 :

在C++中调用DLL中的函数(3)
VS2017动态链接库(.dll)的生成与使用
VS2017——C语言dll编译并调用
#import ,#pragma comment ,LoadLibrary”三种引入dll的方式都分别在什么时候使用?
VS自带工具:dumpbin的使用

前提:

因为需求,要用到dll,之前有段时间要用,但一直卡在缺少其它dll问题的困惑中(其实是dll没放入),所以并没有成功显示链接过dll,这次花了点时间解决了

Dll 和 静态链接库 :

Dll也就是 动态链接库(Dynamic Link Library) 的简称,动态链接库 则是 一个可以被其它应用程序(.exe)共享的程序模块,其中封装了一些可以被共享的例程和资源 ,在应用程序调用时 调用库里面的资源 这就是Dll的动态

静态链接库在 程序链接阶段 将源文件中用到的库函数与汇编生成的目标文件.o合并生成可执行文件 ,这回使得生成的可执行文件 过大,而且对库的修改 不方便,但是可移植性强

Dll 的创建 :

1. 创建dll项目
这里写图片描述
这里写图片描述

2. 创建头文件
这里写图片描述
这里写图片描述

3. 写dll
MathFuncDll.h

#pragma once

#define MathFuncDll_API __declspec(dllexport)

MathFuncDll_API double Add(double a, double b);
MathFuncDll_API double Divide(double a, double b);

MathFuncDll.cpp

// MathFuncDll.cpp: 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"  //预编译头

#include "MathFuncDll.h"
#include <stdexcept>  //标准的异常类

double Add(double a, double b) 
{
    return a + b;
}

double Divide(double a, double b) 
{
    if (b == 0) 
    {
        throw std::invalid_argument("b 不能是 0!");
    }
    return a / b;
}

4. 生成解决方案
这里写图片描述

显示链接Dll

1. 创建空项目
这里写图片描述
这里写图片描述
2. 把dll 添加到项目中
这里写图片描述
注意:一定要放在这个红色的文件夹中,LoadLibrary 中的 路径 就是从这里开始(写绝对路径的话),最好再给dll整合到一个文件夹中 ,我 这里就放在Math文件夹中
这里写图片描述
这里写图片描述

3. 写代码调用
创建main.cpp

#include <iostream>
#include <Windows.h>

using namespace std;

int main() 
{
    typedef double(*fAdd)(double a, double b);
    typedef double(*fDivide)(double a, double b);

    HMODULE dll = LoadLibrary("Math/MathFuncDll.dll");
    cout << GetLastError() << endl; // 获得错误信息,如果缺少dll,报126,正确返回0
    if (dll != NULL) 
    {
        fAdd Add = fAdd(GetProcAddress(dll, MAKEINTRESOURCE(1)));
        if (Add != NULL)
        {
            cout << Add(2, 3) << endl;  //5
        }

        fDivide Divide = fDivide(GetProcAddress(dll, MAKEINTRESOURCE(2)));
        if (Divide != NULL)
        {   
            try
            {
                cout << Divide(5, 0) << endl;
            }
            catch (exception &e) {
                cout << "Caught exception:" << e.what() << endl;
            }
            cout << Divide(6, 2) << endl;
        }

        FreeLibrary(dll);
    }

    system("pause");
    return 0;
}

4. 运行
这里写图片描述

自己遇到的问题:

在调用dll时候,把dll放入工程,开始我以为直接拖入工程,就可以了,如图
这里写图片描述
其实这个没有什么用,运行,会报126,也就是缺少dll文件,也就是dll文件并没有加入这个工程

在解决这个缺少dll文件时,找到一个工具,能查看到dll
InspectExe,安装 路径自定义下,其它都是下一步

使用方式:

1.右键dll属性
这里写图片描述

2.点击inspectexe,查看
这里写图片描述
这里写图片描述

版权声明:本文为zbbzb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zbbzb/article/details/80049103