visual studio创建和链接dll-显示链接

环境:visual studio 2019

本篇主要介绍如何操作并显示链接dll。

win平台dll的链接有两种方式,在上一篇visual studio创建和链接dll-隐式链接中介绍的是如何隐式链接,和显示链接的区别主要有两点。

  1. 隐式链接不需要手动加载dll
  2. 隐式链接在程序启动的时候,系统会自动加载exe和dll
  3. 显示链接只在需要的时候才手动加载,同时也要手动释放
  4. 显示链接在编译主程序的时候不需要静态库做符号链接,但需要手动做符号导出

创建DLL

创建DLL和隐式链接的方式一样,这里不重复介绍,参考visual studio创建和链接dll-隐式链接即可。

创建dll显示加载代码

手动加载dll需要做两个操作,首先loadLibrary加载dll到进程空间,然后GetProcAddress获得符号映射。

这两个功能单独放在math_loader.cpp中实现。

math_loader.h

#pragma once

#ifndef MATH_LOADER
#define MATH_LOADER
bool loadDLL();
int power(int a);
#endif // !MATH_LOADER

math_loader.cpp

#include "math_loader.h"
#include 
#include 

using namespace std;

typedef int (*LIB_power)(int a);

LIB_power lib_power;

bool loadDLL()
{
	HMODULE _math_module;

	_math_module = LoadLibraryA("math_lib.dll");
	if (_math_module == NULL)
	{
		cout << "loader load dll failed" << endl;
		return false;
	}

	lib_power = (LIB_power)GetProcAddress(_math_module, "power");
	if (lib_power == NULL) {
		cout << "get proc address failed" << endl;
		return false;
	}
	return true;
}

int power(int a)
{
	return lib_power(a);
}

loader程序中做了三件事。
加载dll:通过loadLibraryA把dll加载到进程空间
获取符号表映射:GetProcAddress可以通过dll句柄和函数签名获得函数地址,它是个指针
声明和定义dll中的函数:由于应用程序通过指针调用 DLL 函数,因此编译器不生成外部引用,从而不需要与导入库链接。 但是,必须有一个 typedef 或 using 语句来定义所调用的导出函数的调用签名。

主程序代码

显示链接的主程序比隐式链接稍微多几个步骤,我们已经封装到loader程序中了。

main.cc

#include 
#include 
#include "math_loader.h"

using namespace std;

int main(int argc, char const* argv[])
{
    cout << "loading dll..." << endl;
    if (!loadDLL()) {
        cout << "load dll failed!!" << endl;
        return -1;
    }
    cout << "load dll successfully" << endl;

    int a = 2;

    cout << "power by : " << power(a) << endl;
    return 0;
}

创建solution

显示链接的solution是一个单独的项目,跟DLL是分开的,不依赖dll项目。参考visual studio创建和链接dll-隐式链接的主程序创建部分操作即可。

需要修改几个地方,

  1. main.cc的代码用显示链接的替换
  2. 不需要def文件
  3. 不需要dll的头文件

完成后的项目如下,
visual studio创建和链接dll-显示链接_第1张图片

编译生成exe

生成exe的流程跟隐式链接一样,生成后需要把dll也放到exe目录下,

如果目录下没有dll,或者名称不对,则会抛出异常,

.\app.exe
loading dll…
loader load dll failed
load dll failed!!

正确的如下,
visual studio创建和链接dll-显示链接_第2张图片

执行exe,结果

.\app.exe
loading dll…
load dll successfully
using custom power
power by : 4

你可能感兴趣的:(C++)