Delphi如何做一个dll、然后返回一个数组供其他的程序调用

合集下载

Delphi制作DLL的方法

Delphi制作DLL的方法

Delph‎i制作DL‎L的方法‎一 D‎l l的制作‎一般步骤‎二参数传‎递三 D‎L L的初始‎化和退出清‎理[如果需‎要初始化和‎退出清理]‎四全局‎变量的使用‎五调用‎静态载入‎六调用动‎态载入七‎在DLL‎建立一个T‎F orM‎八在DL‎L中建立一‎个TMDI‎C hild‎F orM‎九示例:‎十 De‎l phi制‎作的Dll‎与其他语言‎的混合编程‎中常遇问题‎:十一‎相关资料‎一 Dl‎l的制作一‎般分为以下‎几步:1‎在一个D‎L L工程里‎写一个过程‎或函数2‎写一个E‎x port‎s关键字,‎在其下写过‎程的名称。

‎不用写参数‎和调用后缀‎。

二参‎数传递1‎参数类型‎最好与wi‎n dow ‎C++的参‎数类型一致‎。

不要用D‎E LPHI‎的数据类型‎。

2 最‎好有返回值‎[即使是一‎个过程],‎来报出调用‎成功或失败‎,或状态。

‎成功或失败‎的返回值最‎好为1[成‎功]或0[‎失败].一‎句话,与w‎i ndow‎s c++‎兼容。

3‎用std‎c all声‎明后缀。

‎4最好大‎小写敏感。

‎5 无须‎用far调‎用后缀,那‎只是为了与‎w indo‎w s 16‎位程序兼容‎。

三‎D LL的初‎始化和退出‎清理[如果‎需要初始化‎和退出清理‎]1 D‎L LPro‎c[Sys‎U tils‎单元的一个‎P oint‎e r]是D‎L L的入口‎。

在此你可‎用你的函数‎替换了它的‎入口。

但你‎的函数必须‎符合以下要‎求[其实就‎是一个回调‎函数]。

如‎下:pr‎o cedu‎r e Dl‎l Ente‎r Poin‎t(dwR‎e ason‎: DWO‎R D);f‎a r;st‎d call‎;dwR‎e ason‎参数有四种‎类型:D‎L L_PR‎O CESS‎_ATTA‎C H:进程‎进入时D‎L L_PR‎O CESS‎_DETA‎C H:进程‎退出时D‎L L_TH‎R EAD_‎A TTAC‎H :线程‎进入时D‎L L_TH‎R EAD_‎D ETAC‎H :线程‎退出时在‎初始化部分‎写:‎D LLPr‎o c :=‎@DLL‎E nter‎P oint‎;D‎l lEnt‎e rPoi‎n t(DL‎L_PRO‎C ESS_‎A TTAC‎H);2‎如For‎m上有Td‎c omCo‎n nect‎i on组件‎,就Use‎s Act‎i vex,‎在初始化时‎写一句Co‎I niti‎a lize‎(nil‎);3 ‎在退出时一‎定保证Dc‎o mCon‎n ecti‎o n.Co‎n nect‎e d :=‎Fals‎e,并且数‎据集已关闭‎。

如何在DELPHI中调用外部程序

如何在DELPHI中调用外部程序

如何在Delphi中调用外部程序本实例介绍如何在自己的程序中调用指定的Windows程序。

首先启动一个新的项目,在空白的窗体上添加4个TButton组件。

添加组件后的窗体如图1所示。

图1添加组件后的窗体其中WinExec按钮用于以WinExec函数来调用指定的Windows程序。

ShellExecute按钮用于以ShellExecute函数来调用指定的Windows程序。

CreateProcess按钮和TerminateProcess按钮用于实现对被调用程序更全面的操作,前者用于调用指定的Windows 程序,而后者则用于终止被调用的Windows程序。

以WinExec函数的方式来调用指定的Windows程序的响应代码如下:其中WinExec函数的第1个参数表示了被调用程序的路径和名称,第2个参数表示了程序的显示方式。

以ShellExecute函数的方式来调用指定的Windows程序的响应代码如下:其中ShellExecute用于打开与指定文件关联在一起的程序文件。

第1个参数用于指定一个窗口的句柄;第2个参数指定了程序运行的类别,如’Open’或’Print’;第3个参数指定了想用关联程序打印或打开的一个程序名或文件名;如果第3个参数中指定了一个可执行文件,那么第4个参数就是传递给执行程序的参数;第5个参数指定了可执行程序的完整路径。

最后一个参数用于设定程序运行方式。

下面来介绍利用CreateProcess函数和TerminateProcess函数如何实现对被调用程序更全面的操作。

首先定义3个全局变量:利用CreateProcess函数调用指定程序的响应代码如下:调用CreateProcess函数激活C:\WINNT\Notepad.exe程序后,把它的进程信息存储在变量PI中,然后通过下面的语句来关闭本实例打开的C:\WINNT\Notepad.exe程序:程序代码如下:保存文件,然后按F9键运行程序,程序运行的初始画面如图2所示。

Delphi环境中编写调用DLL的方法和技巧

Delphi环境中编写调用DLL的方法和技巧

第一章为什么要使用动态链接库(DLL) top提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维护升级的重要保证。

(举个例子,笔者的Win95 System目录下尽有500多个DLL文件。

)其实,DLL 是一种特殊的可执行文件。

说它特殊主要是因为一般它都不能直接运行,需要宿主程序比如*.EXE程序或其他DLL的动态调用才能够使用。

简单的说,在通常情况下DLL是经过编译的函数和过程的集合。

使用DLL技术主要有以下几个原因:一、减小可执行文件大小。

DLL技术的产生有很大一部分原因是为了减小可执行文件的大小。

当操作系统进入Windows时代后,其大小已经达到几十兆乃至几百兆。

试想如果还是使用DOS时代的单执行文件体系的话一个可执行文件的大小可能将达到数十兆,这是大家都不能接受的。

解决的方法就是采用动态链接技术将一个大的可执行文件分割成许多小的可执行程序。

二、实现资源共享。

这里指的资源共享包括很多方面,最多的是内存共享、代码共享等等。

早期的程序员经常碰到这样的事情,在不同的编程任务中编写同样的代码。

这种方法显然浪费了很多时间,为了解决这个问题人们编写了各种各样的库。

但由于编程语言和环境的不同这些库一般都不能通用,而且用户在运行程序时还需要这些库才行,极不方便。

DLL的出现就像制定了一个标准一样,使这些库有了统一的规范。

这样一来,用不同编程语言的程序员可以方便的使用用别的编程语言编写的DLL。

另外,DLL还有一个突出的特点就是在内存中只装载一次,这一点可以节省有限的内存,而且可以同时为多个进程服务。

三、便于维护和升级。

细心的朋友可能发现有一些DLL文件是有版本说明的。

(查看DLL文件的属性可以看到,但不是每一个DL L文件都有)这是为了便于维护和升级。

举个例子吧,早期的Win95中有一个BUG那就是在闰年不能正确显示2月29日这一天。

后来,Microsoft发布了一个补丁程序纠正了这个BUG。

Delphi调用外部程序详解[宝典]

Delphi调用外部程序详解[宝典]

Delphi调用外部程序详解Delphi调用外部程序详解(Shellexecute,Winexec)2008-10-0411:27Delphi调用外部程序详解WinExec主要运行EXE文件。

如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。

首先必须引用shellapi.pas单元:uses ShellAPI;1.标准用法ShellExecute函数原型及参数含义如下:function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;●hWnd:用于指定父窗口句柄。

当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。

例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。

●Operation:用于指定要进行的操作。

其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。

当参数设为nil时,表示执行默认操作“open”。

●FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。

●Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。

●Directory:用于指定默认目录。

●ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。

用Delphi制作DLL的方法

用Delphi制作DLL的方法

⽤Delphi制作DLL的⽅法 ⼀ Dll的制作⼀般步骤 ⼆参数传递 三 DLL的初始化和退出清理[如果需要初始化和退出清理] 四全局变量的使⽤ 五调⽤静态载⼊ 六调⽤动态载⼊ 七在DLL建⽴⼀个TForM ⼋在DLL中建⽴⼀个TMDIChildForM 九⽰例: ⼗ Delphi制作的Dll与其他语⾔的混合编程中常遇问题: ⼗⼀相关资料 ⼀ Dll的制作⼀般分为以下⼏步: 1 .在⼀个DLL⼯程⾥写⼀个过程或函数 2 .写⼀个Exports关键字,在其下写过程的名称。

不⽤写参数和调⽤后缀。

⼆参数传递 1 .参数类型最好与window C++的参数类型⼀致。

不要⽤DELPHI的数据类型。

2 .最好有返回值[即使是⼀个过程],来报出调⽤成功或失败,或状态。

成功或失败的返回值最好为1[成功]或0[失败].⼀句话,与windows c++兼容。

3 .⽤stdcall声明后缀。

4 .最好⼤⼩写敏感。

5 .⽆须⽤far调⽤后缀,那只是为了与windows 16位程序兼容。

三 DLL的初始化和退出清理[如果需要初始化和退出清理] 1 .DLLProc[SysUtils单元的⼀个Pointer]是DLL的⼊⼝。

在此你可⽤你的函数替换了它的⼊⼝。

但你的函数必须符合以下要求[其实就是⼀个回调函数]。

如下: procedure DllEnterPoint(dwReason: DWORD);far;stdcall; dwReason参数有四种类型: DLL_PROCESS_ATTACH:进程进⼊时 DLL_PROCESS_DETACH进程退出时 DLL_THREAD_ATTACH 线程进⼊时 DLL_THREAD_DETACH 线程退出时 在初始化部分写: DLLProc := @DLLEnterPoint; DllEnterPoint(DLL_PROCESS_ATTACH); 2 .如Form上有TdcomConnection组件,就Uses Activex,在初始化时写⼀句CoInitialize (nil); 3 .在退出时⼀定保证DcomConnection.Connected := False,并且数据集已关闭。

Delphi动态与静态调用DLL(最好的资料)

Delphi动态与静态调用DLL(最好的资料)

Delphi动态与静态调用DLL(最好的资料)摘要:本文阐述了 Windows 环境下动态链接库的概念和特点,对静态调用和动态调用两种调用方式作出了比较,并给出了 Delphi 中应用动态链接库的实例。

一、动态链接库的概念动态链接库( Dynamic Link Library ,缩写为 DLL )是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。

动态链接库文件的扩展名一般是 dll ,也有可能是 drv 、 sys 和 fon ,它和可执行文件( exe )非常类似,区别在于 DLL 中虽然包含了可执行代码却不能单独执行,而应由 Windows 应用程序直接或间接调用。

动态链接是相对于静态链接而言的。

所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

换句话说,函数和过程的代码就在程序的 exe 文件中,该文件包含了运行时所需的全部代码。

当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。

而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。

仅当应用程序被装入内存开始运行时,在 Windows 的管理下,才在应用程序与相应的 DLL 之间建立链接关系。

当要执行所调用 DLL 中的函数时,根据链接产生的重定位信息, Windows 才转去执行 DLL 中相应的函数代码。

一般情况下,如果一个应用程序使用了动态链接库, Win32 系统保证内存中只有 DLL 的一份复制品,这是通过内存映射文件实现的。

DLL 首先被调入 Win32 系统的全局堆栈,然后映射到调用这个 DLL 的进程地址空间。

在 Win32 系统中,每个进程拥有自己的 32 位线性地址空间,如果一个 DLL 被多个进程调用,每个进程都会收到该 DLL 的一份映像。

Delphi下DLL调用以及共享数据库连接

if @p<>nil then
p(parameter) //调用Dll.含参数。
else
begin
strpcopy(b,'Method Not Defined: '+modulename+'!');
messagebox(message_parameter.mainhandle,b,
第二种:外部函数引用
做一个单元(unit),引用外部函数。例如:
function myDllCall(var i:integer): Integer; stdcall; external 'mydll.dll' name 'mydllpro';
依赖于DLL接口输出方式,或者写成:
function myDllCall(var i:integer): Integer; stdcall; external 'mydll.dll' index my_index;
process_cancel_service_form.showmodal;
process_cancel_service_form.free;
end;
(******************************)
exports
run_cancel_service;
begin
b,'Error...',mb_ok or mb_iconexclamation);
end;
end;
说明:如果你有一个dll是这么写的,
library cancel_service;
uses

在DELPHI中静态调用DLL

一、开始你的第一个DLL专案1.File->Close all->File->New﹝DLL﹞代码://自动产生Code如下library Project2;//这有段废话usesSysUtils,Classes;{$R*.RES}beginend.2.加个Function进来:代码:library Project2;usesSysUtils,Classes;Function MyMax(X,Y:integer):integer;stdcall; beginif X>Y thenResult:=XelseResult:=Y;end;//切记:Library的名字大小写没关系,可是DLL-Func的大小写就有关系了。

//在DLL-Func-Name写成MyMax与myMAX是不同的。

如果写错了,立即//的结果是你叫用到此DLL的AP根本开不起来。

//参数的大小写就没关系了。

甚至不必同名。

如原型中是(X,Y:integer)但引//用时写成(A,B:integer),那是没关系的。

//切记:要再加个stdcall。

书上讲,如果你是用Delphi写DLL,且希望不仅给//Delphi-AP也希望BCB/VC-AP等使用的话,那你最好加个Stdcall;的指示//参数型态:Delphi有很多种它自己的变量型态,这些当然不是DLL所喜欢的//,Windows/DLL的母语应该是C。

所以如果要传进传出DLL的参数,我们//尽可能照规矩来用。

这两者写起来,后者会麻烦不少。

如果你对C不熟//的话,那也没关系。

我们以后再讲。

{$R*.RES}beginend.3.将这些可共享的Func送出DLL,让外界﹝就是你的Delphi-AP啦﹞使用:光如此,你的AP还不能用到这些,你还要加个Exports才行。

代码:{$R*.RES}exportsMyMax;beginend.二、进行测试:开个新application:1.加个TButton代码:ShowMessage(IntToStr(MyMax(30,50)));2.告知Exe到那里抓个Func代码://在Form,interface,var后加Function MyMax(X,Y:integer):integer;stdcall;external'MyTestDLL.dll';//MyTestDLL.dll为你前时写的DLL项目名字//DLL名字大小写没关系。

如何让Delphi调用外部程序并等待其运行结束

要调用外部程序,可以使用API中的WinExec函数或者ShellExecute函数一下是调用Windows内部一些程序的方法========================你要启动“日期/时间属性”,只要在Button的Click事件中加一句:winexec( 'rundll32.exe shell32.dll,Control_RunDLL timedate.cpl ',9);大功告成。

其它:{启动控制面板}winexec( 'rundll32.exe shell32.dll,Control_RunDLL ',9);{辅助选项属性-键盘}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1 ',9);{辅助选项属性-声音}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2 ',9);{辅助选项属性-显示}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3 ',9);{辅助选项属性-鼠标}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4 ',9);{辅助选项属性-常规}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5 ',9);{添加/删除程序属性-安装/卸载}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Appwiz.cpl,,1 ',9);{添加/删除程序属性-Windows安装程序}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Appwiz.cpl,,2 ',9);{添加/删除程序属性-启动盘}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Appwiz.cpl,,3 ',9);{显示属性-背景}winexec( 'rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 ',9); {显示属性-屏幕保护程序}winexec( 'rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1 ',9);{显示属性-外观}winexec( 'rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2 ',9);{显示属性-设置}winexec( 'rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3 ',9);{Internet 属性-常规}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,0 ',9);{Internet 属性-安全}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,1 ',9);{Internet 属性-内容}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,2 ',9);{Internet 属性-连接}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,3 ',9);{Internet 属性-程序}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,4 ',9);{Internet 属性-高级}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,5 ',9);{区域设置属性-区域设置}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,0 ',9);{区域设置属性-数字}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,1 ',9);{区域设置属性-货币}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,2 ',9);{区域设置属性-时间}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,3 ',9);{区域设置属性-日期}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,4 ',9);{游戏控制器-一般}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Joy.cpl,,0 ',9);{游戏控制器-高级}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Joy.cpl,,1 ',9);{鼠标属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Main.cpl ',9);{多媒体属性-音频}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,0 ',9);{多媒体属性-视频}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,1 ',9);{多媒体属性-MIDI}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,2 ',9);{多媒体属性-CD音乐}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,3 ',9);{多媒体属性-设备}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,4 ',9);{调制解调器属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Modem.cpl ',9);{网络}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Netcpl.cpl ',9);{密码属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Password.cpl ',9);{扫描仪与数字相机属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sticpl.cpl ',9);{系统属性-常规}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl,,0 ',9);{系统属性-设备管理器}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl,,1 ',9);{系统属性-硬件配置文件}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl,,2 ',9);{系统属性-性能}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl,,3 ',9);{日期/时间属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL timedate.cpl ',9);{电源管理属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Powercfg.cpl ',9);{拨号属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Telephon.cpl ',9);===================================如何让Delphi调用外部程序并等待其运行结束函数一:usesWindows,SysUtils,Classes,ShellAPI;function RunAndWait(FileName: string; Visibility: Integer): THandle;varzAppName: array[0..512] of Char;zCurDir: array[0..255] of Char;WorkDir: string;StartupInfo: TStartupInfo;ProcessInfo: TProcessInformation;begintryStrPCopy(zAppName, FileName);GetDir(0, WorkDir);StrPCopy(zCurDir, WorkDir);FillChar(StartupInfo, SizeOf(StartupInfo), #0);StartupInfo.cb := SizeOf(StartupInfo);StartupInfo.dwFlags := STARTF_USESHOWWINDOW;StartupInfo.wShowWindow := Visibility;if not CreateProcess(nil, zAppName, nil, nil, false, Create_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) thenbeginresult := 0;Exit;endelsebeginWaitForSingleObject(ProcessInfo.hProcess, INFINITE);GetExitCodeProcess(ProcessInfo.hProcess, result);end;finallyend;end;函数二:function WinExecAndWait32(FileName: string; Visibility: Boolean): integer; varzAppName: array[0..512] of char; //存放应用程序名StartupInfo: TStartupInfo;ProcessInfo: TProcessInformation;exitCode: Dword;aVisibility: integer;beginStrPCopy(zAppName, FileName);FillChar(StartupInfo, Sizeof(StartupInfo), #0);//给StartupInfo结构体赋值StartupInfo.cb := Sizeof(StartupInfo);StartupInfo.dwFlags := STARTF_USESHOWWINDOW;if Visibility thenaVisibility := 1elseaVisibility := 0;StartupInfo.wShowWindow := aVisibility;//调用CreateProcess 创建进程,执行指定的可执行文件if not CreateProcess(nil, zAppName, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) thenResult := -1elsebegin//等待可执行文件退出WaitforSingleObject(ProcessInfo.hProcess, INFINITE);//得到进程终止状态码GetExitCodeProcess(ProcessInfo.hProcess, exitCode);result := Exitcode;end;end;其中参数Visibility 取值如下:行号参数含义1 SW_HIDE 隐藏这个窗体,并激活其他窗体。

Delphi中的DLL

动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。

由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK、ISAPI等。

同时,DLL还为不同语言间代码共享提供了一条方便的途径。

因而DLL在编程时应用较为广泛,本文将介绍如何在 Delphi 中建立和使用DLL。

一.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函数的编写,除了在内存、资源的管理上有所不同外,并不需要其它特别的手段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档