c++ 动态库的加载
转载:https://blog.csdn.net/ztq_12345/article/details/99677769
使用ide是vs, 使用Windows.h下的3个函数对动态库进行加载
第一个:HMODULE LoadLibrary(LibFileName : PChar)//获取dll句柄
参数是需要加载dll的路径,返回值dll句柄
第二个:FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName)//获取函数地址
第一个参数是dll的句柄 ,第二个是调用dll中函数的名称。返回值调用函数地址
第三个:FreeLibrary(HMODULE hModule)//释放dll
参数是需要释放dll的句柄
加载动态库你需要包含2个文件 第一个是动态链接库.dll文件 第二个是静态库.lib
其中需要注意的是你需要在被调用dll中的函数前面一定要加 __declspec(dllexport) 加了过后外部才可以调用
__declspec(dllexport) char *creat()
不过这样编译过后还是会报错 127 这是因为c++支持重载 在编译的时候会在函数后边添加了函数的形参 与c语言不一致,所以在调用dll的时候会找不到调用的函数。你只需要添加extern "C"告诉编译器使用c编译这一部分 就可以运行成功了,
extern “C” __declspec(dllexport) char *creat()
具体代码如下
#include <iostream>
#include <Windows.h>
//加载lib
#pragma comment(lib,"C:\\Users\\ztq\\Desktop\\vs\\plugin_dll\\Debug\\C:\\Users\\ztq\\Desktop\\vs\\plugin_dll\\Debug\\.lib")
int main()
{
HMODULE hDLL;
***//这里是获取dll句柄***
hDLL = LoadLibrary("C:\\Users\\ztq\\Desktop\\vs\\plugin_dll\\Debug\\plugin_dll.dll");
if (hDLL)
{
***//这里是定义指针 。int 是你调用函数返回的类型*** FUNCTION就是一个名称 后面那个括号是跟你的调用函数参数,多个用,号隔开
//我调用dll中的函数没有参数为空,
typedef char *(WINAPI *FUNCTION)();
***//这里是获取调用dll函数的地址***
FUNCTION fun = (FUNCTION)GetProcAddress(hDLL, "creat");
if (fun)
{
***//这里是调用dll中的函数 ***函数返回的是“test” 。
std::cout<<fun()<<std::endl;
}
else
{
***//如果调用错误就打印错误信息***
std::cout << GetLastError() << std::endl;
}
}
***//释放dll***
FreeLibrary(hDLL);
system("pause");
return 0;
}
————————————————
版权声明:本文为CSDN博主「ztq_12345」的原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ztq_12345/article/details/99677769
c++ 动态库的加载的更多相关文章
- 动态库DLL加载方式-静态加载和动态加载
静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib ...
- 关于Linux动态库的加载路径
问题 按如下步骤在Ubuntu上编译安装Google Protocol Buffers $ ./configure $ make $ make check $ sudo make install 运行 ...
- qt在动态库里面加载widget的例子
testDll和testExe项目 备注:windows下dll内不需要new QApplication, linux和mac下面需要在动态库里面new QApplication testdll.h ...
- c#生成动态库并加载
下面这段代码生成dll文件,不能编译运行.点击项目右键,点击生成,这时会在debuge文件中生成相应的配置文件. using System; using System.Collections.Gene ...
- solr6.3.0升级与IK动态词库自动加载
摘要:对于中文的搜索来说,词库系统是一个很比较重要的模块,本篇以IK分词器为例子,介绍如何让分词器从缓存或文件系统中自动按照一定频次进行加载扩展词库 Lucene.Solr或ElasticStack如 ...
- 第一百四十一节,JavaScript,封装库--DOM加载
JavaScript,封装库--DOM加载 DOM加载,跨浏览器封装DOM加载,当网页文档结构加载完毕后执行函数,不等待图片音频视频等文件加载完毕 /** dom_jia_zai()函数,DOM页面加 ...
- Extjs4.1.x使用Application动态按需加载MVC各模块
我们知道Extjs4之后提出了MVC模块开发,将以前肥厚的js文件拆分成小的js模块[model\view\controller\store\form\data等],通过controller拼接黏合, ...
- 动态html,异步加载页面的处理
Selenium 基本使用 # 导入 webdriverfrom selenium import webdriver# 调用键盘按键操作时需要引入的Keys包from selenium.webdriv ...
- Linux下指定so共享库的加载路径
转载地址:https://blog.csdn.net/zorelemn/article/details/52596293,做了部分修改 一.库文件的搜索路径: 1.在配置文件/etc/ld.so.co ...
随机推荐
- shader之间的数据传递
shader之间传递数据实在是太常用了. 下面我们总结几种shader之间传递数据的方法. Name based matching 最简单,也是最常用的一种传递方式是依靠名字进行匹配. 例如我们从ve ...
- android Studio(3.2.1) NDK配置
1.创建as工程 2. 创建class类 3. 生成头文件 3.1 配置命令工具 添加工具: 配置工具: Program: $JDKPath$\bin\javah.exe Arugments:-d j ...
- java基础语法(一)
一.注释: 行内注释 //这是行内注释 多行注释 /* *这是多行注释 */ 文档注释 /** *这是文档注释 */ 二.标识符 标识符也就是我们所说的关键字 三.数据类型 1.基本数据类型 数据 ...
- Tomact的中文乱码设置
在使用Tomact时,有时候使用中文时,窗口会把中文部分显示为乱码,这时需要修改相关配置,让其正常显示. 1.修改server.xml的配置,解决显示窗口的乱码 打开Tomcat下/bin/serve ...
- 深入了解Kafka【三】数据可靠性分析
1.多副本数据同步策略 为了保障Prosucer发送的消息能可靠的发送到指定的Topic,Topic的每个Partition收到消息后,要向Producer发送ACK,如果Produser收到ACK, ...
- [易霖博YCTF]Web WriteUp
中午队里师傅发到群里的比赛,借来队里师傅账号和队里其他师傅一起做了一下,ak了web,师傅们tql.学到挺多东西,总结一下. rce_nopar 进入题目给出源码: <?php if(isset ...
- 学会BeanShell,才敢说自己懂Jmeter
jmeter的BeanShell Sampler,可以直接引用java代码,有下面3种方式: 1.直接输入java代码 2.导入java文件 3.导入class文件 BeanShell脚本访问变量主要 ...
- js map数据结构
Map 对象保存键值对,并且能够记住键的原始插入顺序.任何值(对象或者原始值) 都可以作为一个键或一个值. map对象常用于保存键值对,它的键是任意数据类型,常用于建立数据的映射关系 和对象的区别: ...
- pycharm可以运行但无法debug的解决方法
错误信息:pydev debugger: process 4588 is connecting 如果您尝试了网上的很多方法如防火墙设置,去掉 ".idea"文件,甚至重装pycha ...
- java安全编码指南之:Number操作
目录 简介 Number的范围 区分位运算和算数运算 注意不要使用0作为除数 兼容C++的无符号整数类型 NAN和INFINITY 不要使用float或者double作为循环的计数器 BigDecim ...