动态链接库知识点总结之三(如何以显示的方式加载DLL)

总结一下如何显示加载方式加载DLL,

首先,我们新建一个win32项目,选择dll,空项目,再添加一个源文件,一个模块定义文件(.def),具体如下图。(详细方法已经在前两篇文章中讲述,如有不懂,打开链接查看)

(1)    新建项目,名称为:dll,添加一个源文件(.cpp),编代码,编译文件 。

(2)    为项目添加一个模块定义文件(上一篇文章中详细介绍)(先新建一个文本,再改属性名),编辑代码,如下图

(3)    新建一个DLL测试应用程序(基于对话框的),项目名字:TestDLL,添加一个按钮,属性如下,先编译一下。

(4)    为按钮添加一个响应函数,编写如下代码(具体代码含义在最后介绍)

(5)    把已经编译好的DLL,选择.dll文件将拷贝到应用程序目录下(dll放在与该测试文件的.exe文件夹下(具体做法已在前两篇介绍过),如图

(7)    点击,运行,成功运行,以显示的方式加载DLL成功

现在介绍下,按钮消息响应函数中的代码含义。

函数LoadLibrary()作用是将可执行模块映射到进程的地址空间,通俗点来说,就是可以用来加载DLL的,这个函数是显示加载DLL的重要函数。参数是DLL的名称,这个函数在MSDN上有详细的解释,大家可以通过以下链接查看。该函数返回的是所加载的DLL的句柄。(点击打开链接

有了DLL的句柄,我们需要再获得导出函数的地址即可,获得地址,用此函数:GetProcAddress(),参数1是:DLL句柄,参数2:一个指针,指向导出函数的名字。该函数返回值如果为NULL,则获取地址失败。成功,则返回导出函数的导出地址。

有了地址,我们如何操纵函数,我们还需要一个函数指针,使用函数指针来调用导出函数。

在此我们总结一下:

动态加载DLL时,客户端程序不再需要包含引入库文件,只需要.dll文件即可。静态加载和动态加载各有各的优缺点,首先,静态加载DLL比较简单,但是如果需要加载的DLL过多的话会造成启动程序过慢,所以还是选择动态加载比较好。

动态链接库知识点总结之三(如何以显示的方式加载DLL)

时间: 2024-10-03 13:29:56

动态链接库知识点总结之三(如何以显示的方式加载DLL)的相关文章

无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败。的处理备注方案

网站提示   无法加载 DLL"rasapi32.dll": 动态链接库(DLL)初始化例程失败. (异常来自 HRESULT:0x8007045A). <system.net><defaultProxy><proxy usesystemdefault="false" /></defaultProxy></system.net> 初步怀疑是因为做了云加速服务造成的代理问题,自己瞎猜!反正应该管用

(备忘)vs2010编写动态链接库时导出函数的函数名问题及加载方式

在vs2010中使用.def文件导出函数时,仅仅添加.def文件是不够的,还要在 项目属性 -> 链接器 -> 输入 -> 模块定义文件 中添加自定义的.def文件名. (前提:导入导出都在头文件和源文件中定义好了) ##:静态加载动态链接库 将链接库的 头文件..lib文件 和 .dll 文件拷贝到工程目录下 然后#include 头文件,#pragma comment(lib,"**.lib") 最后直接在需要使用dll函数的地方使用函数就行 ##:动态加载动态链

Android中高效的显示图片之一 ——加载大图

在网上看了不少文章,发现还是官方文档介绍最详细,把重要的东西简单摘要出来.详细可看官方文档地址 ( http://www.bangchui.org/read.php?tid=9 ) . 在应用中显示图片,如果不多加小心,很容易就会使应用因为异常“java.lang.OutofMemoryError:bitmap size exceeds VM budget”而导致crash.在android中加载图片需要一定的技巧性,主要是因为: 1.通常设备资源有限,安卓设备给每个应用只分配16M的空间.当然

php文档知识点整理(函数、方法、文件加载)

函数: 函数定义形式: function  函数名 (形参1,形参2,.... ){ } 函数参数:(2种) 形参: 1,形参一定是一个变量名! 2,该变量名只能是在该函数中有效的变量名: 3,而且只在该函数调用并执行时有效,函数结束,通常这些变量也就"销毁". 实参: 实参就是一个"实际数据", 该数据可以是一个"直接数据"(比如5,"abc"),也可以是一个变量中存储的数据. 实参的作用是将其数据"赋值给&quo

xp系统重绘边框线不显示(首次加载没有触发paint事件)

同样是,重绘边框事件,win7系统显示正常,而xp系统却不显示,这是什么原因造成的呢? 于是,小编开始百度,不停的查找原因,通过一番查找,小编也意外的收获了一些内容: 例如:窗口的拖动,放大,缩小,等,都会重新触发paint重绘事件.那么,什么原因会影响重绘的不显示呢? 最后发现,页面上重写的CreateParams方法(原本是为了解决窗体闪烁的问题),影响了重绘边框的显示.

怎么使MJRefresh上拉刷新完毕显示&quot;已经全部加载完毕&quot;

在上拉结束后,看看MJRefresh做了什么,进入c方法中, 进入之后,如下图: 这里设置了状态,看看状态有哪些,点进去如下图所示: 找到状态后,修改即可, 就是endRefreshing方法执行完毕后, 修改相应mj_footer.state 的状态为MJRefreshStateNoMoreData 即可. 代码如下: 1 // 结束刷新 2 [self.tableView.mj_footer endRefreshing]; 3 self.tableView.mj_footer.state =

网站后端_Python+Flask.0004.FLASK配置管理之三种方式加载外部配置?

简单介绍: 说明: 复杂的项目需要配置各种环境,若设置少可直接硬编码,设置多的话可通过加载配置/加载文件/加载变量的方式来设置 app.config.update(     DEBUG=True, ) 扩展: app.config是flask.config.Config类的实例,继承子PY内置数据结构dict,所以可以使用如上update方法,支持传入多个键值对,其实app.config内置很多配置变量(http://flask.pocoo.org/docs/0.11/config/#Built

Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数

1.主要布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_paren

天气预报——textView显示后再加载数据无法更新,换种方式写

使用了聚合数据的sdk开发: private void initForecastByJuhe(){ Parameters params=new Parameters(); params.add("cityname","烟台"); params.add("dtype", "json"); JuheData.executeWithAPI(getApplicationContext(), 73, "http://op.ju