Delphi5实现DLL的编写、调用

效果图

在这里插入图片描述

显式跟隐式调用差不多的,就重新画了窗体,画的有点粗糙。

在这里插入图片描述

DLL文件

DLL文件是一种包含了可执行代码的库文件,但它不能独立运行,必须由其他程序(如EXE文件)显式或隐式地加载并调用。DLL文件通常用于实现代码的复用、模块化以及跨语言调用等功能。

如何理解跨语言调用?

在不同编程语言之间调用彼此的函数、过程或对象等代码单元的能力。这种机制允许开发者在混合编程环境中充分利用各种编程语言的优势,实现功能的整合与扩展。
开发者可以将特定功能的代码编译成DLL文件,然后在其他语言编写的程序中通过特定的调用机制(如LoadLibrary和GetProcAddress在Windows上)来加载和调用DLL中的函数。

DLL文件的创建

  1. 新建DLL项目:在Delphi5的IDE中,选择“File”->“New”->“Others…”,然后在弹出的对话框中选择“DLL Wizard”或直接在“Project”菜单下选择“New”->“DLL”,点击“OK”按钮创建一个新的DLL项目。
    在这里插入图片描述

  2. 编写代码:在DLL项目中,可以编写函数、过程等代码,这些代码将被编译到DLL文件中。需要注意的是,DLL中的函数和过程需要使用特定的调用约定(如stdcall、cdecl等),以确保它们能被其他程序正确调用。

library Project2;{ Important note about DLL memory management: ShareMem must be thefirst unit in your library's USES clause AND your project's (selectProject-View Source) USES clause if your DLL exports any procedures orfunctions that pass strings as parameters or function results. Thisapplies to all strings passed to and from your DLL--even those thatare nested in records and classes. ShareMem is the interface unit tothe BORLNDMM.DLL shared memory manager, which must be deployed alongwith your DLL. To avoid using BORLNDMM.DLL, pass string informationusing PChar or ShortString parameters. }usesSysUtils,Classes;{$R *.RES}{定义函数时使用的调用约定,如果程序员希望自己的DLL库函数能够被其他程序设计语言的程序调用,应使用stdcall调用约定。}
function Max(x,y,z:Integer):Integer;stdcall;
vart:Integer;
beginif x>y thent:=xelset:=y;if t<z thent:=z;Result:=t;
end;function Min(x,y,z:Integer):Integer;stdcall;
vart:Integer;
beginif x<y thent:=xelset:=y;if t>z thent:=z;Result:=t;
end;{DLL的过程和函数想要在外部被使用,要用exports语句声明供其他应用程序调用的函数和过程名}
exportsMax,Min;begin
end.
  1. 导出函数和过程:在DLL项目的源代码中,需要使用exports语句来导出希望被其他程序调用的函数和过程。只有被导出的函数和过程才能在DLL被加载后,通过GetProcAddress等函数被其他程序获取其地址并调用。

  2. 编译DLL:编写并导出完所需的函数和过程后,就可以编译DLL项目了。编译成功后,将生成一个DLL文件,该文件可以被其他程序加载并调用其中的函数和过程。
    在这里插入图片描述

在这里插入图片描述

DLL文件的调用

隐式调用DLL

静态调用:在Delphi5的源代码中,使用external指示字列出要从DLL中调用的例程。这种方式需要在应用程序开始执行前就将DLL装入内存,并在单元的interface部分用external指示字列出要从DLL中调用的例程。但是,静态调用的缺点是程序在启动时如果找不到DLL将无法运行。

unit Unit1;interfaceusesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Dialogs, Forms,Form, Formprpt, StdCtrls;typeTForm1 = class(MForm)grp1: TGroupBox;edt1: TEdit;Edit1: TEdit;edt2: TEdit;lbl1: TLabel;lbl2: TLabel;lbl3: TLabel;Label1: TLabel;lbl4: TLabel;edt3: TEdit;btn1: TButton;btn2: TButton;procedure btn1Click(Sender: TObject);procedure btn2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;{静态载入在这声明隐式调用又称静态调用或装载时调用,对应于DLL的静态载入。要在应用程序中隐式调用某个动态链接库中的函数,一般要用external语句声明要调用的过程或函数及其所在的DLL文件名。}function Max(x,y,z:integer):integer;stdcall;external 'Project2.dll';function Min(x,y,z:integer):integer;stdcall;external 'Project2.dll';implementation{$R *.DFM}procedure TForm1.btn1Click(Sender: TObject);
varx,y,z,max_v:Integer;
beginx:=StrToInt(edt1.text);y:=StrToInt(edit1.text);z:=StrToInt(edt2.text);max_v:=Max(x,y,z);edt3.Text:=IntToStr(max_v);
end;procedure TForm1.btn2Click(Sender: TObject);
varx,y,z,min_v:Integer;
beginx:=StrToInt(edt1.text);y:=StrToInt(edit1.text);z:=StrToInt(edt2.text);min_v:=Min(x,y,z);edt3.Text:=IntToStr(min_v);
end;end.

显式调用DLL

动态调用:使用Windows API函数LoadLibraryGetProcAddress来实现在运行时间里的动态装载DLL,并调用其中的过程。这种方式可以在需要时才加载DLL,避免了静态调用中可能出现的问题。同时,动态调用还能处理找不到DLL或在装入过程中出错的情况,提高了程序的健壮性。

unit Unit3;interfaceusesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Dialogs, Forms,Form, Formprpt, StdCtrls;typeTForm1 = class(MForm)grp1: TGroupBox;edt1: TEdit;edt2: TEdit;edt3: TEdit;edt4: TEdit;btn1: TButton;btn2: TButton;procedure btn1Click(Sender: TObject);procedure btn2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{动态调用DLL}
typeTintFunction = Function(x,y,z:Integer):Integer;stdcall;varx,y,z:Integer;{$R *.DFM}{定义一个模板,这样只需要把函数名传给这里,就能调用函数了}
Function Calculate(FunName:PChar):Integer;
varDllName:string;Hinst:THandle;ProcName:PChar;Fpointer:TFarProc;Myfunc:TintFunction;
beginGetDir(0,DllName);//当前目录DllName:=DllName+'\Project2.dll'; //获取DLL文件名ProcName:=FunName; //函数名Hinst:=SafeLoadLibrary(DllName); //加载DLL文件if Hinst>0 thentryFpointer:=GetProcAddress(Hinst,ProcName);  //获得API函数的地址,放到指针那if Fpointer<>nil thenbeginMyfunc:=TintFunction(Fpointer);   //获取该地址的函数名Result:=Myfunc(x,y,z);   //运行函数获得结果endelseShowMessage('需要的函数不存在');finallyFreeLibrary(Hinst);endelseShowMessage(DllName+'文件不存在');
end;//点击按钮调用DLL库函数
procedure TForm1.btn1Click(Sender: TObject);
varFunname:PChar;Res:Integer;
beginFunname:='Max';x:=StrToInt(edt1.text);y:=StrToInt(edt2.text);z:=StrToInt(edt3.text);Res:=Calculate(Funname);edt4.Text:=IntToStr(Res);
end;procedure TForm1.btn2Click(Sender: TObject);
varFunname:PChar;Res:Integer;
beginFunname:='Min';x:=StrToInt(edt1.text);y:=StrToInt(edt2.text);z:=StrToInt(edt3.text);Res:=Calculate(Funname);edt4.Text:=IntToStr(Res);
end;end.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392889.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国地铁路线及站点SHP数据

数据是GIS的血液&#xff01; 我们在《126M全球手机基站SHP数据分享》一文中&#xff0c;为你分享过全球手机基站分布数据。 现在再为你分享全国地铁轻轨路线与站点SHP数据&#xff0c;你可以在文末查看该数据的领取方法。 全球地铁路线及站点数据 截至2023年12月31日&…

LAVIS在Mac,M1PRO芯片下的安装实战

LAVIS在Mac,M1PRO芯片下的安装实战 契机 ⚙ 本地想装个图片理解的大模型&#xff0c;看了下blip2感觉比较合适&#xff0c;macos安装的时候有点坑需要注意下&#xff0c;但是最终也无法使用mps加速&#xff0c;比较蛋疼。这里记录下安装步骤。 安装 LAVIS/projects/blip2 a…

【研发日记】Matlab/Simulink技能解锁(十二)——Stateflow中的两种状态机嵌套对比

文章目录 前言 项目背景 两级状态机 函数状态机 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》 见《【研发日记】Matlab/Simulink技能解锁(八)——分布式仿真》 见《【研发日记】Matlab/Simulink技能解锁(九)——基…

数据结构(其四)--特殊矩阵的存储

目录 11.特殊矩阵的压缩存储 &#xff08;1&#xff09;.一维数组的储存结构 &#xff08;2&#xff09;.二维数组的存储结构 &#xff08;3&#xff09;.普通矩阵的存储 &#xff08;4&#xff09;.特殊矩阵的压缩存储 i.对称矩阵 ii.三角矩阵 iii.三对角矩阵 iiii.稀疏矩…

Java多商户新零售超市外卖商品系统

解锁新零售奥秘&#xff0c;多商户外卖超市商品系统大揭秘&#xff01; &#x1f31f; 开篇&#xff1a;新零售时代的浪潮 在这个日新月异的数字化时代&#xff0c;新零售已悄然成为商业变革的新风口。想象一下&#xff0c;足不出户就能逛遍全城商家&#xff0c;心仪商品一键…

力扣——238.移动零

题目 思路 利用双指针&#xff0c;先找到第一个为0的地方指向&#xff0c;指针2指向下一个&#xff0c;指针1之前是已经处理好的数据&#xff0c;指针2进行遍历&#xff0c;遇到非零则与指针1数据交换&#xff0c;然后指针1。 代码 class Solution { public:void moveZeroes(…

离心机转子适配器容量转换器的作用

离心机转子是离心机的核心部件&#xff0c;离心机中的所有系统都配置为保证转子在一定条件下安全运行。转子不仅直接影响分离效果&#xff0c;而且也是离心机技术中的主要承力部件&#xff0c;对离心机的安全性极为重要。 简而言之&#xff0c;离心机可分为两部分&#xff1a;…

Java Web——第二天

什么是JavaScript? JavaScript(简称:JS) 是一门跨平台、面向对象的脚本语言。是用来控制网页行为的&#xff0c;它能使网页可交互 JavaScript和Java是完全不同的语言&#xff0c;不论是概念还是设计。但是基础语法类似 JavaScript在1995年由 Brendan Eich 发明&#xff0c;…

【MySQL】索引概念解析

1.什么是索引&#xff1f; MySQL中的索引是一种数据结构&#xff0c;用于帮助MySQL数据库管理系统快速查询数据。索引的主要目的是提高数据检索的速度&#xff0c;减少数据库系统需要扫描的数据量。 优点&#xff1a; 索引可以极大的提高数据检索效率&#xff0c;降低数据库…

C语言——预处理和指针

C语言——预处理和指针 预处理宏宏定义宏的作用域带参的宏 文件包含条件编译 指针指针的概念指针的定义 预处理 编程的流程分为&#xff1a;编辑、编译、运行、调试四个阶段&#xff1b; 预处理属于编译阶段&#xff0c;编译过程又可以分为&#xff1a;预处理、编译、汇编、链…

TikTok达人效应:品牌出海中的文化桥梁与本土化策略

在全球化的浪潮下&#xff0c;品牌出海已成为企业拓展市场的必经之路。然而&#xff0c;跨越文化差异、实现品牌本土化传播一直是企业面临的巨大挑战。TikTok作为一款全球流行的短视频平台&#xff0c;其庞大的用户基础和强大的影响力&#xff0c;为品牌出海提供了新的机遇。在…

大数据技术复习--大数据与云计算、物联网、人工智能

云计算 ** 概念&#xff1a;美国国家标准技术研究院“一种无处不在的、便捷的且按需的对一个共享的可配置的计算资源&#xff08;如网络&#xff0c;服务器、存储、应用和服务&#xff09;进行网络访问的模式&#xff0c;他能够通过少量的管理或服务供应商的互动实现计算资源的…

CTFHub技能树web——XSS——DOM反射

根据框里的内容 直接右键查看网页源代码 看到 了其闭合方式 然后去网页测试一下alert&#xff08;1&#xff09;反射 ;</script><script>alert(1)</script> 看到 确实存在 去xssaq.cn 创建一个项目 把src粘过来 在第一个输入框中 再将返回回来的url 复…

MATLAB计算心理声学烦恼度例子

在这个例子中&#xff0c;您测量发动机噪音&#xff0c;并使用心理声学指标来模拟其感知响度、尖锐度、波动强度、粗糙度和总体烦扰程度。然后&#xff0c;模拟添加隔音材料&#xff0c;重新计算总体噪音水平。最后&#xff0c;比较恼人程度&#xff0c;并显示应用隔音材料后的…

【LabVIEW学习篇 - 12】:通知器

文章目录 通知器案例一案例二案例三&#xff08;在不同VI中用同一个通知器&#xff09; 通知器 同步技术&#xff1a;同步技术用来解决多个并行任务之间的同步或通信问题。 通知器比较适合一对多的操作&#xff0c;类似于广播&#xff0c;一点发出的通知消息&#xff0c; 其它…

Spring Boot 3.3 新特性介绍

1. 引言 Spring Boot 3.1.x 停止维护了&#xff0c;而 3.3.x 作为最新发布的版本&#xff0c;带来了许多新特性和改进。本篇文章将详细介绍这些新特性&#xff0c;并通过样例代码加以解释&#xff0c;帮助开发者更好地掌握和应用这些新功能。 Spring Boot 3.3现已正式发布&…

Android studio配置代码模版

一、背景&#xff1a; 在工作中&#xff0c;总是要写一些重复的代码&#xff0c;特别是项目有相关规范时&#xff0c;就会产生很多模版代码&#xff0c;每次要么复制一份&#xff0c;要么重新写一份新的&#xff0c;很麻烦&#xff0c;于是我就在想&#xff0c;能不能像创建一…

小程序开发入门:第一天的学习和实践指南

目录 一. 理解小程序的基本概念 1. 无需安装 2. 快速启动 3. 界面简洁 4. 独立性和封闭性 5. 数据安全 6. 框架结构 7. 生命周期 8. 全局配置 9. API支持 10. 发布和更新 二、选择合适的开发工具 1. 微信开发者工具 2. Visual Studio Code 3. Sublime Text 4. …

Tensor安装和测试

1: 打开git官方 https://github.com/NVIDIA/TensorRT 2: 下载得到&#xff1a;TensorRT-10.2.0.19.Linux.x86_64-gnu.cuda-11.8.tar.gz 3: 下载后配置环境变量&#xff0c;上面地址记得改成真实地址。 4: 如果想python使用tensorrt&#xff0c;那么 解压后目录&#xff0c…

【HTML入门】第二十三课 - 【实战】做一个简单的图书详情页

这一节&#xff0c;我们继续用纯HTML来做一个实战小案例。 我找了一个图书详情的页面&#xff0c;就像这样&#xff1a; 这一小节&#xff0c;我们用纯HTML标签&#xff0c;来实现一下这个图书详情的内容。 目录 1 布局分析 2 用到的标签 3 实战代码 1 布局分析 我们看这张…