动态数据库的啥是动态链接库?

author author     2023-03-21     397

关键词:

DLL三个字母对于你来说一定很熟悉吧,它是Dynamic Link Library 的缩写形式,函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。
动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK、ISAPI等。
同时,DLL还为不同语言间代码共享提供了一条方便的途径。因而DLL在编程时应用较为广泛,本文将介绍如何在 Delphi 中建立和使用DLL。
从使用效果看,DLL和unit 很像,它们都可以被别的工程模块所调用,但二者在内部的实现机制上确存在着差别。如果一个程序模块中用uses语句引用了某个unit,编译程序在编译该模块时,便会连同unit一起编译,并把编译后的可执行代码链接到本程序模块中,这就是一个程序模块能够调用所引用unit中过程和函数的原因。
当同一个unit被多个工程所引用时,则每个工程中都含有该unit的可执行代码,当含有该unit的多个工程同时执行时,unit的可执行代码会随不同工程而多次被调入内存,造成内存资源的浪费。DLL则不同,它即使被某个工程调用,编译后仍是独立的。
也就是说编译后,一个DLL库形成一个单独的可执行文件,而不与任何其它的可执行文件连接在一起,因而DLL库并不从属于某个特定的工程,当多个工程调用同一个DLL库时只有第一个工程把DLL库调入内存,其余工程并不重复调入同一个DLL库到内存,而是到同一个共享内存区读取。并且,DLL的执行代码是在程序运行期间动态调入的,而不是如unit在程序运行时就与整个工程一起调入内存。这样便可消除unit带来的相同代码多处占用内存的弊病。Delphi中DLL库的建立
在Delphi环境中,编写一个DLL同编写一个一般的应用程序并没有太大的区别。事实上作为DLL主体的DLL函数的编写,除了在内存、资源的管理上有所不同外,并不需要其它特别的手段。
一般工程文件的格式为:
program 工程标题;
uses 子句;
程序体
而DLLs工程文件的格式为:
library 工程标题;
uses 子句;
exprots 子句; 1.一般工程文件的头标用program关键字,而DLL工程文件头标用library 关键字。不同的关键字通知编译器生成不同的可执行文件。用program关键字生成的是.exe文件,而用library关键字生成的是.dll文件;
2.假如DLL要输出供其它应用程序使用的函数或过程,则必须将这些函数或过程列在exports子句中。而这些函数或过程本身必须用export编译指令进行编译。 在Delphi主菜单file 中选new...项,在弹出的窗口中双击DLL图标,便会自动给出DLL源模块框架,如下:
Library project1;
...注释...
uses
SysUtils, Classes;
begin
end.
接下来便可在USES和begin之间加入想在该DLL中实现的过程和函数的定义,并用export和exprots保字把它们引出,以便别的模块引用,在begin和end之间加入初始化代码,初始化代码是用来对DLL变量初始化的。应注意,即便无初始化代码begin与end也不可省略,如下例:
library minmax;
function Min(X, Y: Integer): Integer; export;
begin
if X < Y then Min := X else Min := Y;
end;
function Max(X, Y: Integer): Integer; export;
begin
if X > Y then Max := X else Max := Y;
end;
exports
Min index 1,
Max index 2;
begin
end.
经编译后,并以minmax.DLL存盘后,一个DLL库文件便形成了。 访问DLL库有两种方式,一种是静态引用,另一种是动态引用。
用静态引用这种方法装入DLL要做两件事情:为DLL 库创建一个输入单元,以及用USES把输入单元连接到要使用DLL 函数的程序模块中。为DLL库创建的输入单元与普通的单元的区别仅在于:在它的接口处声明的过程、函数,并不在它的实现部分给出真正的实现代码,而是用external关键字把过程、函数的实现细节委托给外部DLL模块。
external命令的使用语法如下:
procedure /function 过程/函数名;external DLL模块名;
下面给出为上面创建的minmax.DLL库写的输入单元源文件testdll .pas,从中可看出输入单元与一般单元的一些差别,代码如下所示:
unit testdll;
interface
uses
function Min (X, Y: Integer): Integer;
function Max (X, Y: Integer): Integer;
implementation
function Min; external ‘minmax.DLL’;
function Max; external ‘minmax.DLL’;
end.
一个应用程序若想调用minmax.DLL中的函数,只须在其uses语句中加入testdll 单元即可。
动态装入DLL,要用到Windows的三个API函数。Loadlibrary、Freelibrary和GetprocAddress 。 loadlibrary函数用来装入DLL库,其调用格式如下:
function loadlobrary (DLLfileName:Pchar): THandle:
当不再需要一个DLL库时,应调用FreeLibrary函数将其释放,以空出宝贵的内存资源,其调用格式如下:
procedure FreeLibrary (Libmodule:THandle)
Libmodule 为由LoadLibrary调用得到的DLL库句柄。在用loadlobrary 函数装入某个DLL库和调用FreeLibrary释放该DLL库之间的程序段中, 可以使用该DLL库中的过程和函数,具体使用方法是:用GetprocAddress函数把DLL库中函数的地址传递给程序中某个函数变量,再用该变量实现DLL函数的调用。GetprocAddress函数声名如下
function GetprocAddress (Libmodule:THandle:procname:pchar):TFarProc:
如下例所示:
type
TTimeRec = record
Second: Integer;
Minute: Integer;
Hour: Integer;
end;
TGetTime = procedure(var Time: TTimeRec);
THandle = Integer;
var
Time: TTimeRec;
Handle: THandle;
GetTime: TGetTime;
...
begin
Handle := LoadLibrary('DATETIME.DLL');
if Handle <> 0 then
begin
@GetTime := GetProcAddress(Handle, 'GetTime');
if @GetTime <> nil then
begin
GetTime(Time);
with Time do
WriteLn('The time is ', Hour, ':', Minute, ':', Second);
end;
FreeLibrary(Handle);
end;
end;
在调用动态链接库时应注意, 所需动态链接库须与应用程序在同一目录或Windows System 目录下。
动态链接库是 Windows下程序组织的一种重要方式,使用动态链接库可以极大地保护用户在不同开发工具、不同时期所做的工作,提高编程效率。

参考技术A 动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。
使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您有一个大型网络游戏,如果把整个数百MB甚至数GB的游戏的代码都放在一个应用程序里,日后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个动态链接库中,您无需重新生成或安装整个程序就可以应用更新。
参考技术B 动态链接库(Dynamic Link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。它并不是可执行的文件,而是能向多个程序提供公用代码函数和数据的封装库,程序所需要的一些函数和数据被事先封装在DLL文件中,当程序运行时可以主程序需要调用这些DLL动态链接库,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数,同时有助于共享数据和资源,多个应用程序可同时访问内存中单个 DLL 副本的内容,使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您有一个大型网络游戏,如果把整个数百MB甚至数GB的游戏的代码都放在一个应用程序里,日后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个动态链接库中,您无需重新生成或安装整个程序就可以应用更新。

loadrunner使用动态链接库技术

LoadRunner使用动态链接库技术  什么是动态库?动态库一般又叫动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供... 查看详情

如何根据另一个动态库链接动态库?

】如何根据另一个动态库链接动态库?【英文标题】:HowcanIlinkdynamiclibrarydependingonanotherdynamiclibrary?【发布时间】:2016-03-2614:04:34【问题描述】:我使用动态库libexample.so制作了一个程序。动态库依赖于另一个动态库libtool.so。由于... 查看详情

动态链接库

动态链接库建立动态链接库的方法新建项目–>win32控制台应用程序–>Dll注意:画蓝色线部分是静态链接库动态链接库的使用方法隐式链接方式隐式连接方法使用动态链接库需要用到动态链接库程序生成的.lib文件(.li... 查看详情

动态链接库和静态链接库

#1,静态链接库lib指令在exe中;不能再包含其他动态库或静态库; #2,动态链接库该dll不必在最终exe文件中;exe可“动态”引用或卸载这个dll;可以包含其他的动态库或者静态库; #3,动态库的其他概念dll的编程机制与具... 查看详情

动态链接库管理

动态链接库管理 ldconfig是一个动态链接库管理命令。为了让动态库为系统所共享,还需要运行动态链接库的管理命令--ldconfig。 ldconfig命令的用途主要是在默认搜索目录(lib和/usr/lib)以及动态库的配置文件/etc/ld.so.conf内... 查看详情

动态链接库

一 动态链接库源文件#include"dongtai.h"int__stdcallplus(intx,inty){ returnx+y;}//动态链接库和静态链接库的本质区别是静态链接库在编译的时候由编译器直接编译到.exe文件中//但是动态链接库不会直接编译到.exe文件中而是在程序需... 查看详情

动态链接库和静态链接库的区别

一、指代不同1、动态链接库:是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。2、静态链接库:函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),VisualC++的编译器在链接过程中将从静态库中恢复... 查看详情

windows动态链接库编程

Windows动态链接库编程 1、介绍Windows操作系统是应用最关的操作系统,因此动态链接库也为程序员所熟悉,即使对于普通的使用者来说,很多时候也会碰到.dll结尾的文件,这就是动态链接库文件。Windows下的动态链接库可以通... 查看详情

安装虚拟机时,提示无法定位程序输入点readdir于动态链接库dirent.dll上

安装linx虚拟机汉化时,提示无法定位程序输入点readdir于动态链接库dirent.dll上,求大神指点。。。。参考技术A不知道你用的啥虚拟机。推荐你用virtualbox,原因见:【整理】虚拟机的选择,VMWare还是VirtualBox–绝对推荐VirtualBox关于... 查看详情

静态链接库和动态链接库(代码片段)

静态链接库和动态链接库共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamiclinklibrary。一种是LIB包含函数代码本身,在编译时直接... 查看详情

静态和动态链接库

】静态和动态链接库【英文标题】:StaticandDynamicLinkingLibraries【发布时间】:2013-08-2311:53:43【问题描述】:我有一些关于链接库的问题。链接器如何决定我要链接的库是静态链接还是动态链接?是由文件扩展名(.a/.so)决定的吗... 查看详情

g++编译动态链接库和静态链接库

现在我有hello1.cpp和hello2.cpp两个文件,现在我要生成动态链接库libhello.so和静态链接库libhello.a。以下为步骤:1.生成动态链接库:g++-m32hello1.cpphello2.cpp-fPIC-shared-o../lib/linux32/libhello.so-m32为生成32位的动态链接库,-m64位生成64位的动... 查看详情

计算机科学基础知识动态链接

...、前言本文以类似helloworld这样的简单程序为例,描述了动态连接的概念。第二章描述了整个动态链接的大概过程,随后的两章解析了程序访问动态库中的数据和调用动态库中函数的过程。注意:阅读本文之前需要先了解relocatable... 查看详情

动态链接库dll

VC++深入详解(17):动态链接库http://blog.csdn.net/thefutureisour/article/details/8201484 查看详情

动态链接库使用

//动态链接库测试2.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include<windows.h>//隐式连接:这种连接方式是由编译器自己加载DLL文件的/*#pragmacomment(lib,"动态链接库2.lib")extern"C"_declspec(dllimport)intA 查看详情

插件之dlopen/dlsym/dlclose加载动态链接库(代码片段)

dlopen,dlsym,dlclose加载动态链接库参考:采用dlopen、dlsym、dlclose加载动态链接库【总结】linux动态库加载的秘密三种思路:解决动态库版本兼容1.插件插件(Plug-in又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。应用软... 查看详情

静态库和动态库同时链接

...序需要链接外部库的情况下,linux默认对库的链接是使用动态库,在找不到动态库的情况下再选择静态库。当动态库与静态库混合链接时,使用-static会导致所有的库都使用静态链接的方式,这时就需要-Wl的方式: gcc–otest... 查看详情

gcc编译使用动态链接库和静态链接库(代码片段)

1库的分类根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。有别于静态... 查看详情