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 ...
随机推荐
- 攻防世界——Misc新手练习区解题总结<2>(5-8题)
第五题gif: 下载附件后,解压得到这样一个文件 几经寻找无果后,发现是不是可以将gif中的黑白图片看做二进制的数字,进而进行解密 最后用二进制转文本得到flag 第六题掀桌子: 看起来是16进制的密 ...
- RTS寻路算法
https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html https://www.zhihu.com/question/2 ...
- Python Embedded
文档 https://docs.python.org/3/extending/index.html https://www.codeproject.com/articles/11805/embeddi ...
- 关于js重名方法的先后调用问题
当js中方法重名时,最后引入的js会覆盖前面的引入的js(就是说会调用最后引入的js中的方法)详情参照(main.js与white.js 的a())但是,当最后一个js中存在语法上的错误时(也可以是本 ...
- Springboot-Mybatis-进阶
目录 数据库关系 ResultMap association collection 动态sql if where set choose foreach 缓存 一级缓存 二级缓存 开启二级缓存 配置 异 ...
- docker 容器中部署 Go 服务时,请求 https 文件时抛错
错误提示: Get https://res.ddkt365.com/ddktRes/imageRes/wx_headimg/0f1d9e55913c22bcaf7cca9b38048d29.jpeg: ...
- 163net邮箱,对商务办公人士有哪些帮助?
在职场当中,无论是沟通交流,还是文档对接,电子邮箱都是是必不可少的办公助手,163net付费邮箱作为很多人的首选工作邮箱,相较于免费邮箱而言,究竟有哪些优势呢? 1. 专属网络空间,有容 ...
- jmeter服务器监控磁盘IO、网络-PerfMon Metrics Collector
1.jmeetr客户端安装jp@gc - PerfMon Metrics Collector 先安装jmeter-plugins 启动jmeter ——> 客户端选项 ——> jmeter ...
- UNIX编程艺术
本文主要是 <UNIX编程艺术>的摘录,摘录的主要是我觉得对从事软件开发有用的一些原则. 对于程序员和开发人员来说,如果完成某项任务所需要付出的努力对他们是个挑战却又恰好还在力所能及的范围 ...
- dom:文档对象模型,提供的api去操作页面上的元素
dom对象通过html标签转义成了文档操作对象