C++ dll的隐式与显式调用



转载自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html


  应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0(或者更先进的版本)在VC\bin目录下提供了一个名为Dumpbin.exe的小程序(使用方法见VS自带工具:dumpbin的使用),用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。

  1.隐式链接

  隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码:

//Dlltest.h#include"MyDll.h"
#pragma comment(lib,"MyDll.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
//TestDll.cpp
#include"Dlltest.h"
void main()
{int a;
a=min(8,10)
printf("比较的结果为%d\n",a);
}


  在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern "C"。TestDll.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,"MyDll.lib")语句,而直接在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。

  2.显式链接

  显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。

#include <windows.h>
#include <cstdio>
void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax Max
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
A=Max(5,8);
Printf("比较的结果为%d\n",a);
FreeLibrary(hDLL);//卸载MyDll.dll文件;
}

  在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。

  使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。

注意两点:

1.上面中提到extern "C",表明函数使用c语言的风格编译函数,这样后面显式调用时,GetProcAddress第二个参数就是原来的函数名,否则如果使用C++编译的话支持函数重载,则第二个参数会发生变化,想要知道发生了什么变化,可以使用前面提到的Dumpbin工具查看dll的生成函数。具体参考文章:http://www.cnblogs.com/laogao/archive/2012/12/07/2806528.html

2.MAKEINTRESOURCE()函数可以代替复制dll生成的函数的一大串字符串名,但是必须知道函数生成的顺序,所以你也必须打开dll查看,才能知道。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》——6.5节光照的每顶点计算与每片元计算...

本节书摘来自异步社区《OpenGL ES 2.0游戏开发&#xff08;上卷&#xff09;&#xff1a;基础技术和典型案例》一书中的第6章&#xff0c;第6.5节光照的每顶点计算与每片元计算&#xff0c;作者 吴亚峰&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 6.5 光照…

毛笔笔锋算法IOS版

http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/#.VUln2_mqpBe转载于:https://www.cnblogs.com/wangjinming/p/4481145.html

USE PDFCREATE TO CREATE A PDF FILE

来源&#xff1a;http://www.pdfforge.org/files/old_forum/1002.html a working sample with C & COM 2007-08-15 22:56:18 by eckart hi, here is a working sample of how to use PDFCreator in Visual C (after searching on internet for something similar I guess t…

python将一行作为字段_关于python:Django admin在同一行显示多个字段

我已经创建了一个模型&#xff0c;它将自动显示模型中的所有字段&#xff0c;并将其显示在管理页面上。 现在&#xff0c;我有一个问题&#xff0c;我希望在同一行中有两个字段&#xff0c;为此&#xff0c;我必须在modeladmin中指定字段集&#xff1a; 1 2 3 4 5fieldsets ( …

c++显式加载dll并使用DLL的类

转载自&#xff1a; &#xfeff;&#xfeff;http://blog.163.com/tianjunqiang666126/blog/static/8725911920121064573594/ 首先需要强调&#xff0c;当使用某个类时一般目的有二&#xff1a;实例化成对象或者继承它产生新类。对于前者&#xff0c;我们可以构造一个抽象类&a…

如何在Debian上安装配置ownCloud

如何在Debian上安装配置ownCloud 据其官方网站&#xff0c;ownCloud可以让你通过一个Web界面或者WebDAV访问你的文件。它还提供了一个平台&#xff0c;可以轻松地查看、编辑和同步您所有设备的通讯录、日历和书签。尽管ownCloud与广泛使用Dropbox非常相似&#xff0c;但主要区别…

jQuery相当于对 javascript二次开发,所以基于 jQuery实现的各种插件直接调用即可...

jQuery相当于对 javascript二次开发&#xff0c;所以基于 jQuery实现的各种插件直接调用即可转载于:https://www.cnblogs.com/npk19195global/p/4482363.html

[转]js判断url是否有效

本文转自&#xff1a;http://www.cnblogs.com/fumj/p/3490121.html 方法一:(仅适用于ie) function CheckStatus(url){XMLHTTP new ActiveXObject("Microsoft.XMLHTTP")XMLHTTP.open("HEAD",url,false)XMLHTTP.send()return XMLHTTP.status200}function Ne…

VS中lib和dll

转载&#xff1a; &#xfeff;&#xfeff;http://www.cnblogs.com/Yogurshine/archive/2013/06/14/3136025.html Lib文件 先来说一说lib文件&#xff0c;C中lib文件主要有两类&#xff0c;一种是静态的编译连接&#xff0c;叫做静态链接库&#xff0c;另一种是动态的编译链…

32位md5解密_冰蝎特征检测及报文解密

点击“蓝字”关注我们&#xff0c;不迷路~‍‍前言19年驻场于某金融单位。参加19年9月、11月两次攻防演练&#xff0c;负责攻防演练组织、技术支持和复盘。期间&#xff0c;多个攻击队伍使用冰蝎 webshell &#xff0c;防守方监测时确实各 IDS 确实报出 webshell 连接&#xff…

使用extern C改善显式调用dll

extern "C"的简单解析 我们前面介绍了显式调用dll的方法&#xff0c;例如 &#xfeff;&#xfeff;http://www.cnblogs.com/laogao/archive/2012/12/07/2806528.html &#xff0c;其中在GetProcAddress第二个参数的填写煞费苦心&#xff0c;我们需要比较麻烦…

《移动App测试的22条军规》—App测试综合案例分析23.13节测试微信App的流量和电量消耗...

本节书摘来自异步社区《移动App测试的22条军规》一书中的App测试综合案例分析&#xff0c;第23.13节测试微信App的流量和电量消耗&#xff0c;作者黄勇&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 23.13 测试微信App的流量和电量消耗关于微信App消耗流…

UVA 10269 Super Mario,最短路+动态规划

这个题目我昨晚看到的&#xff0c;没什么思路&#xff0c;因为马里奥有boot加速器&#xff0c;只要中间没有城堡&#xff0c;即可不耗时间和脚力&#xff0c;瞬间移动不超过L距离&#xff0c;遇见城堡就要停下来&#xff0c;当然不能该使用超过K次。。。我纠结了很久&#xff0…

python做数据可视化的代码_Python数据可视化正态分布简单分析及实现代码

Python说来简单也简单&#xff0c;但是也不简单&#xff0c;尤其是再跟高数结合起来的时候。。。 正态分布&#xff08;Normaldistribution&#xff09;&#xff0c;也称“常态分布”&#xff0c;又名高斯分布&#xff08;Gaussiandistribution&#xff09;&#xff0c;最早由A…

ACdream 1061(abs用法)

题目链接&#xff1a;http://acdream.info/problem?pid1061 主要是abs用法&#xff0c;看题目的数据 long long的最大值&#xff1a;9223372036854775807 long long的最小值&#xff1a;-9223372036854775808 unsigned long long的最大值&#xff1a;18446744073709551615 由题…

wpf window 不执行show 就不能load执行_Numpy反序列化命令执行漏洞分析(CVE-2019-6446)附0day...

1、介绍 NumPy 是 Python 机器学习库中之一&#xff0c;主要对于多为数组执行计算。NumPy 提供大量的 函数和操作&#xff0c;能够帮助程序员便利进行数值计算。在 NumPy 1.16.0 版本之前存在反序列化 命令执行漏洞&#xff0c;用户加载恶意的数据源造成命令执行。2、环境 软件…

使用Def文件导出dll

前面我们介绍了dll的生成&#xff0c;大多数是使用extern "C"__declspec(dllexport)函数名的方法导出dll。其实我们还有另一种方法来导出dll。 先介绍参考文献&#xff1a; 1.dll导出声明相关 2.VS2012中 C创建DLL图解 3.DLL中导出函数的两种方式(dllexport与.…

HDU 1003 Maxsum

题目大意&#xff1a;求出数列的最大子段和&#xff0c;并且说明是从第几项至第几项。 题解1&#xff1a;简单贪心。 #include <cstdio> #define rep(i,n) for(int i1;i<n;i) int main(){int t,l0;scanf("%d",&t);while(t--&&l){if(l!1)printf…

《JavaScript面向对象精要》——1.8 原始封装类型

本节书摘来自异步社区《JavaScript面向对象精要》一书中的第1章&#xff0c;第1.8节&#xff0c;作者&#xff1a;【美】Nicholas C. Zakas著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.8 原始封装类型 JavaScript中一个最让人困惑的部分可能就是原始…

XML语法学习

本文章集合两篇博文而写&#xff0c;两篇博文地址&#xff1a; XML学习总结(二)——XML入门&#xff1a; XML基础<第一篇> XML简介 XML是一种标记语言&#xff0c;用于描述数据&#xff0c;它提供一种标准化的方式来来表示文本数据。XML文档以.xml为后缀。需要彻底注…