动态链接库的使用

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中与导入函数相匹配的导出函数了。原型如下:

FARPROC GetProcAddress(
  HMODULE hModule,    // handle to DLL module DLL的句柄
  LPCSTR lpProcName   // name of function 导入函数的名称
);

GetProcAddress函数的返回值为DLL导出函数地址。

3释放DLL库

在使用完DLL之后,必须用FreeLibrary函数来释放动态链接库。原型如下:

BOOL FreeLibrary(
  HMODULE hLibModule   // handle to loaded library module DLL句柄
);

采用显式链接方式调用DLL库,程序员可以决定加载哪个DLL文件,这使得程序的设计更为灵活。

本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/06/21/1761666.html

DLL-使用DLL的更多相关文章

  1. [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), ...

  2. 四种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 ...

  3. 无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块

    无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块.(异常来自 HRESULT:0x8007007E).

  4. 无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败。

    无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败. 在Asp.Net项目中使用WebClient或HttpWebRequest时出现以上错误 解决方案:把以下代码放在 ...

  5. 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90.dll/msvcr100.dll等文件

    ---转载:http://hi.baidu.com/liu_haitao/item/e2157ac3a3c32a0bc610b253 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90 ...

  6. C# 合并DLL, 合并DLL进入EXE

    原文:C# 合并DLL, 合并DLL进入EXE 使用方法非常简单 在项目属性窗口中,选择"生成事件",在"生成后事件命令行"下的文本框中输入 ilmerge / ...

  7. loadrunner破解方法--lm70.dll,mlr5lprg.dll下载地址

    一.由于在压力测试执行中,出现一个-10803的错误 ,为解决这个错误,重新设置的环境变量,在次执行错误,这个问题解决了,但另外一个问题出来了,LR,打开脚本编辑器老提示找不到TEMP目录,当时没有想 ...

  8. 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 ...

  9. PC高级语言与施耐德、罗克韦尔、台达等PLC的Modbus通讯源代码(ModbusTCP.DLL/ModbusRTU.DLL)

    1.0  通讯组件概述 该类通讯组件适用于基于PC高级语言的工业自动化控制系统,用于PC与可编程控制器(PLC).智能仪表等进行数据通讯.组件采用动态链接库文件(*.DLL)的形式,在PC系统的项目工 ...

  10. Unity 代码编译成dll 更新dll实现热更代码

    Unity 代码编译成dll 更新dll实现热更代码 实现流程 代码编译成DLL DLL打包成AssetBundle 加载AssetBundle 加载代码程序集 获取指定类 使用反射赋值 C#代码编译 ...

随机推荐

  1. Linux常用命令 day day up系列2

    一.alias--设置别名二.du--统计目录及文件空间占用情况三.mkdir--创建新目录四.touch--创建空文件五.ln--创建链接文件1.链接文件类型六.cp--复制文件或目录七.rm--删 ...

  2. Spring Boot(一):如何使用Spring Boot搭建一个Web应用

    Spring Boot Spring Boot 是Spring团队旗下的一款Web 应用框架 其优势可以更快速的搭建一个Web应用 从根本上上来讲 Spring Boot并不是什么新的框架技术 而是在 ...

  3. C语言:n++ , ++n,n--,--n

    #include <stdio.h> int main() { int a=3,x; x=(a++)+(++a)+(++a); // 3(4) 5(5) 6(6) printf(" ...

  4. Java基础00-集合基础15

    1. 集合基础 1.1 集合概述 1.2 ArrayList构造方法和添加方法 代码示例: 想通过指定索引添加到最后一个位置的话就填写,现有索引的+1,比如3个索引就是4.如果在指定索引的位置添加没有 ...

  5. IO编程之IO流

    Java的IO流是实现输入.输出的基础,它可以方便的实现数据的输入输出操作.在Java中把不同的输入输出源(键盘.文件.网络连接)抽象表述为流(stream).通过流可以使java程序使用相同的方式访 ...

  6. HTML - form表单操作

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. Unittest方法 -- 以test开头实例

    此篇是以下面的test作为实战的 : Unittest方法 -- 项目实现自动发送邮件 1.test_01 import unittestfrom selenium import webdriverc ...

  8. sql-5-事务,索引

    事务 1.ACID概念 原子性(Atomicity) 要么都成功,要么都失败 一致性(consistency) 事务前后的数据完整性保持一致 持久性(Durability) 事务一旦提交则不可逆,持久 ...

  9. 小程序框架WePY 从入门到放弃踩坑合集

    小程序框架WePY 从入门到放弃踩坑合集 一点点介绍WePY 因为小程序的语法设计略迷, 所以x1 模块化起来并不方便, 所以x2 各厂就出了不少的框架用以方便小程序的开发, 腾讯看到别人家都出了框架 ...

  10. Thinkphp大批量插入数据库的处理方法和速度对比

    最近在使用TP框架写一个读取excel数据并将其插入到mysql数据库中的小功能.当excel中的数据条数非常多(几千甚至上万),并且多很多个列,并且某些列的内容还非常多的时候就容易出现问题. 第一种 ...