c++动态库封装及调用(3、windows下动态库调用)
1.DLL的隐式调用
隐式链接采用静态加载的方式,比较简单,需要.h、.lib、.dll三件套。新建“控制台应用程序”或“空项目”。配置如下:
项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件testdll.h所在的目录
项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件testdll.lib所在的目录
项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“testdll.lib”(若有多个 lib 则以空格隔开) 。 //你也可以在代码中添加一行设置库的链接,#pragma comment(lib, "DLLSample.lib")
库文件头文件等目录设置,本文将库文件及头文件拷贝到工程目录下DLL文件夹下
添加LIB依赖项
#调用的源程序#
// callmyDLL.cpp : 定义控制台应用程序的入口点。
//包含头头文件,函数声明 #include "stdafx.h"
#include "stdlib.h"
#include "myDLL.h" int _tmain(int argc, _TCHAR* argv[])
{
//这是通过上节的extern方式调用的
int z= Add(,);
//也可以通过类导出的方式调用
//CmyDll dll;
//int z = dll.Add(1,2);
printf("z is:%d\n", z);
system("pause");
return ;
}
以上如果包含目录、库目录、库的依赖项都没有问题就可以生成成功了
#运行时最后一步:将动态库文件拷贝到可执行文件目录下,否则会出现如下错误。
如何没有设置lib目录和依赖项,可以在代码中添加以下一行代码也可以生成成功
// callmyDLL.cpp : 定义控制台应用程序的入口点。
//包含头头文件,函数声明 #include "stdafx.h"
#include "stdlib.h"
#include "myDLL.h"
#prama comment(lib, "myDll.lib")
//此时的myDll.lib的路径必须能找到的,可以给定一个全路径如:“c:\\myDll.lib” int _tmain(int argc, _TCHAR* argv[])
{
int z= Add(,);
printf("z is:%d\n", z);
system("pause");
return ;
}
所以通过设置依赖项和库目录和添加#Prama是具有相同效果的,如果有问题,得检查是否两者的生成平台不同(如win32和x64)或者一个是Debug一个是release
2、DLL显示调用
对于显示连接,即动态加载我们需要调用LoadLibrary
在MSDN中:HMODULE WINAPI LoadLibrary(
__in LPCTSTR lpFileName
);
它的功能是映射一个可执行模块到调用进程的地址空间。由此我们知道显示调用就是函数指针来调用函数。
Steps:
1、声明头文件<windows.h>,说明我想用windows32方法来加载和卸载DLL
2、然后用typedef定义一个指针函数类型.typedef void(*fun) //这个指针类型,要和你调用的函数类型和参数保持一致
3、定一个句柄实例,用来取DLL的实例地址。HINSTANCE hdll;
格式为hdll=LoadLibrary(“DLL地址”);这里字符串类型是LPSTR,当是unicode字符集的时候会不行,
因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可。
4、取的地址要判断,返回的句柄是否为空,如果为无效句柄,那么要释放加载DLL所占用的内存。
5、定义一个函数指针,用来获取你要用的函数地址。
然后通过GetProcAdress来获取函数的地址,参数是DLL的句柄和你要调用的函数名:比如:FUN=(fun)GetProcAdress(hdll,"sum");
这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄。
6、然后通过函数指针来调用函数。
7、调用结束后,就释放句柄FreeLibrary(hdll);
直接上代码,一一一一一目了然
// callDLLSee.cpp : 定义控制台应用程序的入口点。
//通过调用windowsAPI 来加载和卸载DLL
#include "stdafx.h"
#include "Windows.h"
typedef int(*Dllfun)(int , int); int _tmain(int argc, _TCHAR* argv[])
{
Dllfun funName;
HINSTANCE hdll;
//put DLL under the Debug path
//use _T 设置为宽字符
hdll = LoadLibrary( _T("myDLL.dll"));
if (hdll == NULL)
{
FreeLibrary(hdll);
}
funName = (Dllfun)GetProcAddress(hdll, "Add");
if (funName == NULL)
{
FreeLibrary(hdll);
}
int x = , y = ;
double z= funName(r, h);
printf("z= %d\n", z); FreeLibrary(hdll);
return ;
}
参考此系列:http://www.cppblog.com/suiaiguo/archive/2016/01/28/90619.html#212749
c++动态库封装及调用(3、windows下动态库调用)的更多相关文章
- Windows下静态库与动态库的创建与使用
Windows下静态库与动态库的创建与使用 学习内容:本博客介绍了Windows下使用Visual C++ 6.0制作与使用静态库与动态库的方法. --------CONTENTS-------- 一 ...
- c++动态库封装及调用(2、windows下动态库创建)
DLL即动态链接库(Dynamic-Link Libaray)的缩写,相当于Linux下的共享对象.Windows系统中大量采用了DLL机制,甚至内核的结构很大程度依赖与DLL机制.Windows下的 ...
- Windows下动态库的隐式调用
多年的工作经验告诉我Windows下使用动态库最简单的方法:使用def导出函数,然后隐式调用. 具体做法如下: (1)首先使用visual studio 创建“Win32项目”,如下图: (2)然后在 ...
- Windows下静态库、动态库的创建和调用过程
静态库和动态库的使用包括两个方面,1是使用已有的库(调用过程),2是编写一个库供别人使用(创建过程).这里不讲述过多的原理,只说明如何编写,以及不正确编写时会遇见的问题. //注:本文先从简单到复杂, ...
- Windows下动态库的编译以及调用
1.MFC下生成动态库 1>显式调用 在.cpp文件里添加接口函数 int sum(int a,int b) { return a + b; } int sub(int a,int b) { r ...
- Windows下zlib库和libPng库的编译和使用
关于zlib库和libpng是干嘛的,我就不说了,度娘和谷歌都能告诉你.这里主要记录下windows下如何利用vs2010编译和使用这两个库. 一.zlib库的编译 首先要下载这个库,这个谷歌和百度也 ...
- windows下用c++调用caffe做前向
参考博客: https://blog.csdn.net/muyouhang/article/details/54773265 https://blog.csdn.net/hhh0209/article ...
- windows下使用c++调用redis
不废话,unix下c++调用 redis可以看这个: http://blog.csdn.net/youngqj/article/details/8266177 ==================== ...
- 【数据库开发】windows下使用c++调用redis
不废话,unix下c++调用 redis可以看这个: http://blog.csdn.net/youngqj/article/details/8266177 ==================== ...
随机推荐
- MT【34】正余弦的正整数幂次快速表示成正余弦的线性组合
问题:如何快速把$cos^4xsin^3x$表示成正弦,余弦的线性组合? 分析:利用牛顿二项式展开以下表达式: 再利用欧拉公式$e^{i\theta}=cos\theta+isin\theta$ 比如 ...
- 集成Android免费语音合成功能(在线、离线、离在线融合)
集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离线)集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合) 转眼间,大半年没 ...
- Hdoj 2187.悼念512汶川大地震遇难同胞——老人是真饿了 题解
时间:2008年5月16日(震后第4天) 地点:汶川县牛脑寨 人物:羌族老奶奶 [转载整理]牛脑寨是一个全村600多人的羌族寨子,震后几天,这里依然能常常听到隆隆的声音,那是对面山上石头不断滑落的声音 ...
- [luogu1131][bzoj1060][ZJOI2007]时态同步【树形DP】
传送门:https://www.luogu.org/problemnew/show/P1131 题目大意 给你一棵树,每条边有边权,要求增加一些边的边权,使得根节点到每个叶子节点的距离相等,求出最少共 ...
- [luogu3919]可持久化数组【主席树】
链接:https://www.luogu.org/problemnew/show/P3919 分析 很明显我们可以用主席树来维护,所谓主席树就是可持久化线段树,能够查询历史版本而且可以实现修改操作,反 ...
- EOJ2018.10 月赛
EOJ2018.10 月赛 题目一览表(Green color indicate understand and Accept) 来源 考察知识点 完成时间 A oxx 的小姐姐们 EOJ 数学+思维 ...
- Winform下载文件并显示进度条
本来是要研究怎样判断下载完成,结果找到这个方法,可以在这个方法完成之后提示下载完成. 代码如下: using System; using System.Collections.Generic; usi ...
- CodeForces842C 树上dfs
http://codeforces.com/problemset/problem/842/C 题意: 有一个n个节点的数,每个点有一个点权,根到这个点的所有点权(包括这个点和根)的gcd值为这个点的答 ...
- ECharts图表引用json数据
来讲两个图表,一个折线图,一个饼图. 先来看看效果图: 现在来看看代码,先来折线图,后台: (这里的后台太麻烦了,写的太多.可以使用Linq的方式,Linq比较简单写的也少.参考我的这篇文章的2018 ...
- TCP的代码
视频已经发布,这里是所有的代码仅供参考. TCP服务器: MainWindow里面的代码: using System; using System.Collections.Generic; using ...