dll动态加载

简介

cpp 加载dll 可以分为在编译的时候进行加载或者是在执行代码的时候进行动态加载

编译加载

dll 的制作

制作一个class static 的函数的dll,然后在编译的时候链接,但是这样如果dll 数量过多,只要有一个dll 不存在,整个程序都会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cmake_minimum_required(VERSION 3.29)  
project(DllLearn)

# 设置C++标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 指定库的搜索路径
set(LINK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib) # 假设lib文件夹在项目根目录下
link_directories(${LINK_DIR})

# 设置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)

# 添加可执行文件
add_executable(DllLearn main.cpp)

# 链接到导入库
target_link_libraries(DllLearn dllTest)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cmake_minimum_required(VERSION 3.29)  
project(DllLearn)

# 设置C++标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 指定库的搜索路径
set(LINK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib) # 假设lib文件夹在项目根目录下
link_directories(${LINK_DIR})

# 设置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)

# 添加可执行文件
add_executable(DllLearn main.cpp)

# 链接到导入库
target_link_libraries(DllLearn dllTest)

注意:

  1. dll 放入exe 的目录下
  2. target_link_libraries(DllLearn dllTest) 放入的是lib 的名字,可以不用.lib
  3. 有一个很大的弊端就是很嘛饭,如果缺少一个dll 整个程序无法运行

动态加载

1
2
3
4
5
6
7
8
9
10
11
12
13
cmake_minimum_required(VERSION 3.29)  
project(DllLearn)

# 设置C++标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


# 设置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)


add_executable(DllLearn main.cpp)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <windows.h>  
#include <iostream>

int main() {
// 动态加载dll
HINSTANCE hdll=LoadLibrary("dlltest.dll");
if(hdll==NULL){
std::cout<<"load dll failed"<<std::endl;
return 0;
}

using hello_t = void(*)();
auto hello=(hello_t) GetProcAddress(hdll,"hello");
if(hello==NULL){
std::cout<<"get function failed"<<std::endl;
return 0;
}
hello();

}

只要保证dll 的路径exe 能加载就行


dll动态加载
https://tsy244.github.io/2024/09/29/cpp/dll动态加载/
Author
August Rosenberg
Posted on
September 29, 2024
Licensed under