c++调用dll动态库
调用dll
,首先就有c++
与windows
冲突的故事.
所以,先把障碍解决掉.
首先在库上
用 名字空间 标;
#define NOMINMAX
#include <窗口.h>
去掉min,max
不然,折腾.
然后要解决char byte与std::byte
的冲突.这里更详细.
在cpp
上添加:
#define _HAS_STD_BYTE 0
#include <常用>
#include "解库号.cpp"
如下.然后,就可以编译正常了.
我们的库不用写def
文件.因为写了,也不知道如何用
.不写,也能用得起.而且更爽.
先编译动态库.cl /LD
开头.剩余的与编译正常程序一样
.
当然
,编译之前,要将头文件加上 引出
关键字.
引出为__declspec(dllexport)
,只能加在普通函数上.不能导出模板
.
详细加载库代码在这里
:
#pragma once
用 名字空间 标;
#define NOMINMAX
#include <窗口.h>
//因为max等冲突了.
//想办法隐藏那几个函数.不然利用不了我的函数库
类 解库号{
H模块 m;无序映<串,整>列;整 大小=0;
公:
解库号():m(空针){}
~解库号(){卸载();}
极 卸载(){//可以手动卸载
如(m==空针)中 真;
动 b=释放库(m);如(!b)中 假;
m=空针;中 真;
}
极 加载(常 符*l,常 符*y){
串 a=l,b=y;中 加载(a,b);
}
极 加载(串&l,串&y){//库名,及其<名,号>映射
m=加载库(l.数据());文件至串整(y,列);
大小=列.大小();
如(空针==m){打印("找不到");中 假;}
中 真;
}//名字加编号
//自然是取函数的意思
元<型名 T>函数<T>取(整 i){//号
断定(i>=0&&i<大小,"必须在区间");
动 d=取过程地址(m,(符*)(i));
中 函数<T>((T*)(d));//转为指针
}
整 转整(串&l){
动 t=列.查找(l);//打印(t->第二);
断定(t!=列.尾(),"未找到函数");中 t->第二;
}
元<型名 T>函数<T>取(串&l){//号
中 取<T>(转整(l));
}
元<型名 T,型名...O>
型名 调果型<T,O...>执行(整 i,O&&...o){
动 f=取<T>(i);断定(f!=空针,"找不到");
中 f(前向<O>(o)...);
}//不折腾,减少不了啥
元<型名 T,型名...O>
型名 调果型<T,O...>执行(串&l,O&&...o){
中 执行(转整(l),前向<O>(o)...);
}
};
当然,这里要感谢祁宇
大神的dllparser
.
在编译好dll
后,用viewapi提取出序号,函数名
.其内部用的是utf8
格式,转成gbk
.然后,自己处理下,搞成函数名,序号
格式.
然后整个文件,命名为导出.txt
.这样,加载本dll
的同时,加载这个导出文件
,这样就可以用函数名
来取函数了.
最后是测试代码:
#define _HAS_STD_BYTE 0
#include <常用>
#include "解库号.cpp"
//#define NOMINMAX
空 主(){
//用 B=函数<整(整,整)>;
//又 整(*B)(整,整);
解库号 j;j.加载("常用.dll","导出.txt");
串 d{"符在串"};
动 t=j.取<极(符,串&)>(d);
//注意,连&都要加上,不然,要报错.
//动 b=(B*)GetProcAddress(h,(符*)(2));
//用序号
符 c{'a'};串 b{"bat"};
极 i=t(c,b);
//极 i=t(b);
输出<<i;
}
注意,在函数<T>
的T
中,连&
也要加上.不然要报错.
还有返回类型也要一致
.不然要报错
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现