简介
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)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(LINK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/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)
|
注意:
- dll 放入exe 的目录下
target_link_libraries(DllLearn dllTest)
放入的是lib 的名字,可以不用.lib
- 有一个很大的弊端就是很嘛饭,如果缺少一个dll 整个程序无法运行
动态加载
1 2 3 4 5 6 7 8 9 10 11 12 13
| cmake_minimum_required(VERSION 3.29) project(DllLearn)
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() { 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 能加载就行