DLL-使用DLL
动态链接库的使用
fangyukuan
2010.6.21
应用程序可以调用的DLL函数,在DLL中叫做导出函数,而在应用程序中叫做导入函数。应用程序中的导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。
一、隐式链接
在建立一个DLL文件时,编译器会自动生成一个与该文件对应的导入库文件(扩展名为lib)。该文件包含了DLL中所有导出函数所有DLL库的名称,应用程序可以根据这个文件来寻找并加载DLL。由于在程序中没有出现加载DLL的代码,所以把这种链接方式叫做隐式链接。
Windows搜索DLL的顺序为:
1. 包含应用程序EXE文件的目录。
2. 进程的当前工作目录。
3. Windows系统目录。
4. Windows目录。
5. 列在Path环境变量中的一系列目录。
例子:
声明导入函数。
#include "stdafx.h"
void SayHello(void);
int _tmain(int argc, _TCHAR* argv[])
{
SayHello();
return 0;
}
另外在工程设置好lib的路径。
如果没有设置好,将连接不过。如下:
>Linking...
1>2_DLLDemoCall.obj : error LNK2019: unresolved external symbol "void __cdecl SayHello(void)" (?SayHello@@YAXXZ) referenced in function _wmain
二、显式链接
例子见:http://www.cnblogs.com/fangyukuan/archive/2010/06/20/1761464.html
如果在应用程序中使用Windows API函数直接完成DLL库函数的调用,那么这种做法就叫做DLL的显式方式,当然这不必使用导入库文件了。
方法如下:
1获得DLL库
通过调用Win32的LoadLibrary 函数,并以要使用的DLL文件所在的路径为参数,可以取得DLL。LoadLibaray函数的原型如下:
HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // DDL的路径
);
函数的返回值为DLL库的句柄。
2.获得DLL函数
获得了DLL的句柄之后,接下来就可以在应用程序中通过调用Win32 API函数GetProcAddress来获得该DLL中与导入函数相匹配的导出函数了。原型如下:
FARPROCGetProcAddress(
HMODULE hModule, // handle to DLL module DLL的句柄
LPCSTR lpProcName // name of function 导入函数的名称
);
GetProcAddress函数的返回值为DLL导出函数地址。
3释放DLL库
在使用完DLL之后,必须用FreeLibrary函数来释放动态链接库。原型如下:
BOOLFreeLibrary(
HMODULE hLibModule // handle to loaded library module DLL句柄
);
采用显式链接方式调用DLL库,程序员可以决定加载哪个DLL文件,这使得程序的设计更为灵活。
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/06/21/1761666.html
DLL-使用DLL的更多相关文章
- [ASP.NET 5]终于解决:Unable to load DLL 'api-ms-win-core-localization-obsolete-l1-2-0.dll'
11月12日,惊喜地发现SqlClient(System.Data.SqlClient.dll)跨平台了(对应的nuget包包是runtime.unix.System.Data.SqlClient), ...
- 四种DLL:NON-MFC DLL, Regular DLL Statically/Dynamically Linked to MFC, MFC Extension DLL
参考资料: https://msdn.microsoft.com/en-us/library/30c674tx.aspx http://www.cnblogs.com/qrlozte/p/484442 ...
- 无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块
无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块.(异常来自 HRESULT:0x8007007E).
- 无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败。
无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败. 在Asp.Net项目中使用WebClient或HttpWebRequest时出现以上错误 解决方案:把以下代码放在 ...
- 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90.dll/msvcr100.dll等文件
---转载:http://hi.baidu.com/liu_haitao/item/e2157ac3a3c32a0bc610b253 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90 ...
- C# 合并DLL, 合并DLL进入EXE
原文:C# 合并DLL, 合并DLL进入EXE 使用方法非常简单 在项目属性窗口中,选择"生成事件",在"生成后事件命令行"下的文本框中输入 ilmerge / ...
- loadrunner破解方法--lm70.dll,mlr5lprg.dll下载地址
一.由于在压力测试执行中,出现一个-10803的错误 ,为解决这个错误,重新设置的环境变量,在次执行错误,这个问题解决了,但另外一个问题出来了,LR,打开脚本编辑器老提示找不到TEMP目录,当时没有想 ...
- Unable to load DLL 'api-ms-win-core-localization-l1-2-0.dll': 找不到指定的模块
asp.net mvc 4.6 发布到WinServer2008R2 SP1 提示 错误 Unable to load DLL 'api-ms-win-core-localization-l1-2-0 ...
- PC高级语言与施耐德、罗克韦尔、台达等PLC的Modbus通讯源代码(ModbusTCP.DLL/ModbusRTU.DLL)
1.0 通讯组件概述 该类通讯组件适用于基于PC高级语言的工业自动化控制系统,用于PC与可编程控制器(PLC).智能仪表等进行数据通讯.组件采用动态链接库文件(*.DLL)的形式,在PC系统的项目工 ...
- Unity 代码编译成dll 更新dll实现热更代码
Unity 代码编译成dll 更新dll实现热更代码 实现流程 代码编译成DLL DLL打包成AssetBundle 加载AssetBundle 加载代码程序集 获取指定类 使用反射赋值 C#代码编译 ...
随机推荐
- Tomcat网站根目录设置
直接将war放入到webapps目录下 修改server.xml文件,在Host节点下添加如下代码 <Context path="/" docBase="web&q ...
- 备战- Java虚拟机
备战- Java虚拟机 试问岭南应不好,却道,此心安处是吾乡. 简介:备战- Java虚拟机 一.运行时数据区域 程序计算器.Java 虚拟机栈.本地方法栈.堆.方法区 在Java 运行环境参考链接: ...
- Luogu2839 [国家集训队]middle 题解
题目很好,考察对主席树的深入理解与灵活运用. 首先看看一般解决中位数的思路,我们二分一个 \(mid\),将区间中 \(\ge mid\) 的数置为 \(1\),小于的置为 \(-1\),然后求区间和 ...
- python 管理工具
pip 包管理工具 virtualenv 虚拟环境管理工具 切换目录 virtualenvwrapper 虚拟环境管理工具加强版 pyenv python版本管理工具 修改环境变量 pyenv-vir ...
- windows 10家庭版安装SQL Server 2014出现.net 3.5失败问题解决。
在安装SQL Server 2014的过程中,出现.net 3.5缺失,导致失败问题. 后来,研究了下,解决思路如下: 先将电脑更新到了windows 10专业版,(因为需要用到专业版才有的组策略管理 ...
- jstack 命令使用经验总结
jstack 命令的基本使用 jstack 在命令使用上十分简洁, 其信息量与复杂度主要体如今 thread dump 内容的分析上;web # 最基本的使用sudo -u xxx jstack {v ...
- 随处可编辑的编辑器之神VIM
据说这世界上只有三种编辑器:Vim,Emacs 和 其他编辑器,其中 Vim 被称作编辑器之神,Emacs 被称作神的编辑器,当然,其他编辑器永远只能是其他编辑器. 拿一位 网友的话 来说,VIM 的 ...
- 使用C#winform编写渗透测试工具--Web指纹识别
使用C#winform编写渗透测试工具--web指纹识别 本篇文章主要介绍使用C#winform编写渗透测试工具--Web指纹识别.在渗透测试中,web指纹识别是信息收集关键的一步,通常是使用各种工具 ...
- Spring Boot实现数据访问计数器
1.数据访问计数器 在Spring Boot项目中,有时需要数据访问计数器.大致有下列三种情形: 1)纯计数:如登录的密码错误计数,超过门限N次,则表示计数器满,此时可进行下一步处理,如锁定该账户 ...
- Golang中如何正确的使用sarama包操作Kafka?
Golang中如何正确的使用sarama包操作Kafka? 一.背景 在一些业务系统中,模块之间通过引入Kafka解藕,拿IM举例(图来源): 用户A给B发送消息,msg_gateway收到消息后,投 ...