参考文章:DLL教程 - 如何编写动态链接库 DLL_生成dll库-CSDN博客
1、编写DLL
1.1 创建DLL
这里取名DynamicLibrary
生成项目:
1.3 组织文件
创建一个新的 DLL 项目时,通常会自动生成一些预编译头文件和其他文件,这些文件的作用是帮助加快编译速度和提高代码组织结构。然而,并不是所有的预编译文件都是必需的,有时候可以根据项目需求删除一些不需要的文件。
-
pch.h: 这是预编译头文件,用于包含需要在整个项目中都可用的标准头文件,以及经常使用但很少更改的自定义头文件。如果你决定不使用预编译头文件,可以将其删除。
-
pch.cpp: 这是预编译源文件,用于编译预编译头文件。如果不使用预编译头文件,也可以将其删除。
-
framework.h: 这个文件通常包含一些项目中经常使用的标准头文件,类似于
pch.h
,但是它不是预编译头文件。如果你不需要这样的文件,也可以删除它。 -
dllmain.cpp: 这是 DLL 的入口函数文件,包含了 DLL 的入口函数
DllMain
。通常建议保留这个文件,因为DllMain
函数是 DLL 的主要入口点,负责处理 DLL 的初始化和清理工作。 -
先在setting里面设置不使用预编译,然后删除预编译文件,见图3。本文只留dllmain.cpp
-
1.4 添加DLL的头文件和源文件
这里取名DynamicLibrary.h/DynamicLibrary.cpp
头文件:
#pragma once
extern "C" int __declspec(dllexport) add(int a, int b);
源文件:
#include"DynamicLibrary.h"
int add(int a, int b)
{
return a + b;
}
1.5 编译程序生成DLL。
最后右键生成,默认会在<工程目录>\x64\Debug下生成DynamicLibrary.dll和DynamicLibrary.lib.
该lib文件不同于<https://blog.csdn.net/weixin_43758311/article/details/133955852>中的静态库文件,此lib文件只是dll文件中导出函数的声明和定位信息,并不包含函数的实现(而第一节中的静态库文件,包含了函数的实现),因此此lib文件只是在调用对应dll库的工程编译时使用,不需要随exe发布。
2、调用DLL
2.1 新建控制台项目
命名为DynamicLibraryLoader
2.2 添加代码源文件
DynamicLibraryLoader.cpp
#include <iostream>
#include <windows.h>
typedef int (*lpAddFun)(int, int); // 定义函数指针类型
int main()
{
HINSTANCE hDll; // DLL 句柄
lpAddFun addFun; // 函数指针
hDll = LoadLibrary(L"DynamicLibrary.dll"); // 动态获取dll文件的路径
if (hDll != nullptr)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add"); // 根据函数名在dll文件中获取该函数的地址
if (addFun != nullptr)
{
int result = addFun(2, 3);
printf("2 + 3 = %d\n", result);
}
else
{
std::cout << "Failed to get function address.\n";
}
FreeLibrary(hDll);
}
else
{
std::cout << "Failed to load DLL.\n";
}
std::cout << "Hello World!\n";
return 0;
}
运行项目。
输出:
但生成文件夹:C:\Users\Administrator\Desktop\Cpp_code\DynamicLibraryLoader\x64\Debug。
这个文件夹里有DynamicLibraryLoader.exe
2.3 转移DLL
拷贝DynamicLibrary.dll文件到DynamicLibraryLoader.exe所在目录
源目录:C:\Users\Administrator\Desktop\Cpp_code\DynamicLibrary\x64\Debug
目标目录:C:\Users\Administrator\Desktop\Cpp_code\DynamicLibraryLoader\x64\Debug
2.4 再次运行项目
创作不易,多多点赞。感谢前辈的付出,本博客参考大佬的文章: