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 ==================== ...
随机推荐
- HNOI2017大佬
贼难的一道题 虽然算法都不难,但组合起来就是想不到 首先,最简单的一步,对所有大佬,嘲讽你减的自信值和你做水题回复自信值都是不变的,写个\(dp\),设\(dp[i][j]\)表示第\(i\)天自信值 ...
- 【转】九大排序算法-C语言实现及详解
概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...
- 洛谷 P1110 [ZJOI2007]报表统计 解题报告
P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
- A1037. Magic Coupon
The magic shop in Mars is offering some magic coupons. Each coupon has an integer N printed on it, m ...
- [luogu1351][联合权值]
题目地址 https://www.luogu.org/problemnew/show/P1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为 ...
- 也谈同步异步I/O
也谈同步异步I/O [转自: http://www.smithfox.com/?e=191 ] I/O Model 是一个很大的话题, 也是一个实践性很强的事情, 网上有各种说法和资料, 我们必须用辩 ...
- 常用nginx rewrite重定向-跳转实例:
1,将www.myweb.com/connect 跳转到connect.myweb.com rewrite ^/connect$ http://connect.myweb.com permanent; ...
- dojo.js --dojo Quick Start/dojo入门手册1
我看了http://www.cnblogs.com/mylem/archive/2009/11/11/1600984.html这篇博客以后 ,就开始设计自己的代码,其实很多解释都是在我的代码里,所以就 ...
- 【CSS】定义元素的对齐方式
1.文本内容居中对齐:text-align.扩展用法:父元素嵌套子元素时,且子元素的宽度小于父元素宽度,使用text-align:center,可以实现子元素的居中对齐. <!DOCTYPE h ...
- 过时date.toLocaleString()的解决方法
System.out.println(new java.util.Date()); 输出:Thu Jan 27 14:43:28 CST 2011 System.out.println(new jav ...