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#代码编译 ...
随机推荐
- 「CF986F」 Oppa Funcan Style Remastered
「CF986F」 Oppa Funcan Style Remastered Link 首先发现分解成若干个 \(k\) 的因数很蠢,事实上每个因数都是由某个质因子的若干倍组成的,所以可以将问题转换为分 ...
- 「BZOJ 2956」模积和
「BZOJ 2956」模积和 令 \(l=\min(n,m)\).这个 \(i\neq j\) 非常不优雅,所以我们考虑分开计算,即: \[\begin{aligned} &\sum_{i=1 ...
- C语言共同体
结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: union 共用体名{ ...
- python pandas 读excel类
import pandas as pd '''特例说明 file1="a20201220.xlsx" sheetname='Sheet1' df=pd.read_excel(fil ...
- SFC style CSS variable injection
摘要 在单文件组件样式中支持使用组件状态驱动的 CSS 变量( CSS 自定义属性). 基础示例 <template> <div class="text"> ...
- mac设置终端命令行别名alias(git、npm)
别名(alias)通常被用作对一串或单个命令的简称.懒人必备!当常用到命令行操作的时候,每次输入一长串命令,不厌其烦,自然想到了用简称代替.这里主要介绍两种mac设置别名alias的方式. mac 设 ...
- 微信小程序云开发-列表下拉刷新
一.json文件开启页面刷新 开启页面刷新.在页面的json文件里配置两处: "enablePullDownRefresh": true, //true代表开启页面下拉刷新 &qu ...
- 八大排序算法~简单选择排序【记录下标k变量的作用】
八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...
- Lesson 12 Life on a desert island
Lesson 12 Life on a desert island desert island ['dezət 'ailənd] n. 荒岛 uninhabited island coral isla ...
- 【NOIP2007】Hanoi双塔问题
题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现要将这些圆盘移到C柱上 ...