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 ...
随机推荐
- 如何设计Restful风格的API
RestfulAPI就是由后台(SERVER端)来提供接口,前端来调用.前端调用API向后台发起HTTP请求,后台响应请求将处理结果反馈给前端.也就是说Restful 是典型的基于HTTP的协议.那么 ...
- shader之间的数据传递
shader之间传递数据实在是太常用了. 下面我们总结几种shader之间传递数据的方法. Name based matching 最简单,也是最常用的一种传递方式是依靠名字进行匹配. 例如我们从ve ...
- C# .NET容器的源码
这里有List<T>的源码http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs
- Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储
一,引言 上一篇文章,我们介绍到在实际项目中系统会产生大量的日志文件,用户上传的头像等等,同时也介绍到可以使用Azure Blob Storage 来存储项目中的一些日志文件,用户头像,用户视频等等. ...
- 小程序开发-小程序tabBar不显示的原因分析
在尝试小程序开发时,tabBar这个是个非常常见的组件,但是今天在进行开发时,设置了TabBarb并没有显示,被这个问题困扰了近半小时,现在将排查问题后所得到的经验记录下来. 首先 如果tabBar不 ...
- CentOS 7 安装部署 cassandra作为kairosdb的数据存储
环境 Centos 7.4 java 1.8.0 安装步骤 java yum -y install java-1.8.0-openjdk* cassandra wget https://mirrors ...
- 10.QT-QAudioOutput类使用
本章需要用到的类如下: QAudioDeviceInfo类提供音频输出设备 QAudioFormat类提供音频参数设置 QAudioOutput类提供了用于将PCM原始音频数据发送到音频输出设备的接口 ...
- 【NOIP2012模拟8.7】奶牛编号
Description Input Output Solution 对于这道题,我们先设0放x个,1放k个k个 设当前剩下x'个0和k'个1,则对于剩下的位置,我们可以把它抽象成将x'个0插入到x'+ ...
- 【NOIP2013模拟】黑魔法师之门
题目描述 经过了16个工作日的紧张忙碌,未来的人类终于收集到了足够的能源.然而在与Violet星球的战争中,由于Z副官的愚蠢,地球的领袖applepi被邪恶的黑魔法师Vani囚禁在了Violet星球. ...
- 关于如何设置IDEA中的servlet的模板
关于如何设置IDEA中的servlet的模板 点击左上角的File: Setting --> Editor --> File and Code Templates --> Other ...