Windows Api学习笔记-动态连接库(DLL)的使用
#include <windows.h> #include <iostream> #include "12dll.h" using namespace std; #pragma comment(lib,"12Dll")//要链接到什么库文件 void main() { //CMy12Dll a; cout<<fnMy12Dll()<<endl; char b; cin>>b; } |
VS2008
新建WIN32项目
选择动态连接库
应用程序类型为:WINDOWS 应用程序
附加选项为:导出符号
dllmain.cpp中有动态连接库的入口函数
BOOL APIENTRY DllMain(HANDLE hModule, //DLL模块句柄 DWORD ul_reason_for_all, //调试原因 LPVOID lpReserved //没有使用 ) { switch (ul_reason_for_all) { case DLL_PROCESS_ATTACH: //动态链接库刚被映射到某个进程的地址空间 g_hModule = (HMODULE)hModule; break ; case DLL_PROCESS_DETACH: //动态链接库将被卸载 break ; } return TRUE; } |
动态连接库的主要逻辑函数如下:
#include "stdafx.h" #include "12Dll.h" // 这是导出变量的一个示例 MY12DLL_API int nMy12Dll=12345; // 这是导出函数的一个示例。 MY12DLL_API int fnMy12Dll( void ) { return 67890; } // 这是已导出类的构造函数。 // 有关类定义的信息,请参阅 12Dll.h CMy12Dll::CMy12Dll() { return ; } |
动态链接库的逻辑函数是通过如下代码在头文件中公开给外部的
// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 MY12DLL_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // MY12DLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef MY12DLL_EXPORTS #define MY12DLL_API __declspec(dllexport) #else #define MY12DLL_API __declspec(dllimport) #endif // 此类是从 12Dll.dll 导出的 class MY12DLL_API CMy12Dll { public : CMy12Dll( void ); // TODO: 在此添加您的方法。 }; extern MY12DLL_API int nMy12Dll; MY12DLL_API int fnMy12Dll( void ); |
如何使用刚刚创建的DLL
有两种办法
一:
把DLL,LIB,和声明导出函数的头文件一起复制到工程文件的主目录下
然后引入头文件
然后就可以想使用自己的函数一样使用动态连接库中的函数了
代码如下
#include <windows.h> #include <iostream> #include "12dll.h" using namespace std; #pragma comment(lib,"12Dll")//要链接到什么库文件 void main() { //CMy12Dll a; cout<<fnMy12Dll()<<endl; char b; cin>>b; } |
二:
在DLL工程中加入一个def文件
名字可以随便起
内容如下:
LIBRARY "12Dll" EXPORTS fnMy12Dll |
重新生成DLL工程
重新开被到目标工程
目标工程代买改为如下
#include <windows.h> #include <iostream> using namespace std; typedef int (*my_dll_func)( void ); //预定义函数的名字 void main() { HMODULE hModule = ::LoadLibrary( "F:\\test\\10test\\10test\\12Dll.dll" ); if (hModule != NULL) { my_dll_func mf = (my_dll_func)::GetProcAddress(hModule, "fnMy12Dll" ); if (mf != NULL) { cout<<mf()<<endl; } } char b; cin>>b; } |
运行就看到答案了
分类:
WIN API学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统