Delphi的DLL技巧汇集

Delphi Dll 创建和使用(2) Delphi中DLL的创建和使用      1.DLL简介;   2.调用DLL;   3.创建DLL;   4.两个技巧;   5.初始化;   6.例外处理。              1、DLL简介       DLL是Dynamic-Link   Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图、图标等)。可以认为DLL和EXE基本上是一回事,只是 阅读详情
   
Delphi的DLL技巧汇集
  
  调用一个DLL比写一个DLL要容易一些。首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。同样的,我们先举一个静态调用的例子。
  
  unit Unit1;
  
  interface
  
  uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls;
  
  type
  TForm1 = class(TForm)
  Edit1: TEdit;
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end;
  
  var
  Form1: TForm1;
  
  implementation
  
  {$R *.DFM}
  
  //本行以下代码为我们真正动手写的代码
  
  function TestDll(i:integer):integer;stdcall;
  external ’Delphi.dll’;
  
  procedure TForm1.Button1Click(Sender: TObject);
  begin
  Edit1.Text:=IntToStr(TestDll(1));
  end;
  
  end.
  
  上面的例子中我们在窗体上放置了一个编辑框(Edit)和一个按钮(Button),并且书写了很少的代码来测试我们刚刚编写的Delphi.dll。大家可以看到我们唯一做的工作是将TestDll函数的说明部分放在了implementation中,并且用external语句指定了Delphi.dll的位置。(本例中调用程序和Delphi.dll在同一个目录中。)让人兴奋的是,我们自己编写的TestDll函数很快被Delphi认出来了。您可做这样一个实验:输入“TestDll(”,很快Delphi就会用fly-by提示条提示您应该输入的参数是什么,就像我们使用Delphi中定义的其他函数一样简单。
  
  注意事项有以下一些:
  
  一、调用参数用stdcall。
  
  和前面提到的一样,当引用DLL中的函数和过程时也要使用stdcall参数,原因和前面提到的一样。
  
  二、用external语句指定被调用的DLL文件的路径和名称。
  
  正如大家看到的,我们在external语句中指定了所要调用的DLL文件的名称。没有写路径是因为该DLL文件和调用它的主程序在同一目录下。如果该DLL文件在C:/,则我们可将上面的引用语句写为external ’C:/Delphi.dll’。注意文件的后缀.dll必须写上。
  
  三、不能从DLL中调用全局变量。
  
  如果我们在DLL中声明了某种全局变量,如:var s:byte 。这样在DLL中s这个全局变量是可以正常使用的,但s不能被调用程序使用,既s不能作为全局变量传递给调用程序。不过在调用程序中声明的变量可以作为参数传递给DLL。
  
  四、被调用的DLL必须存在。
  
  这一点很重要,使用静态调用方法时要求所调用的DLL文件以及要调用的函数或过程等等必须存在。如果不存在或指定的路径和文件名不正确的话,运行主程序时系统会提示“启动程序时出错”或“找不到*.dll文件”等运行错误。
  
  编写技巧
  
  1 、为了保证DLL的正确性,可先编写成普通的应用程序的一部分,调试无误后再从主程序中分离出来,编译成DLL。
  
  2 、为了保证DLL的通用性,应该在自己编写的DLL中杜绝出现可视化控件的名称,如:Edit1.Text中的Edit1名称;或者自定义非Windows定义的类型,如某种记录。
  
  3 、为便于调试,每个函数和过程应该尽可能短小精悍,并配合具体详细的注释。
  
  4 、应多利用try-finally来处理可能出现的错误和异常,注意这时要引用SysUtils单元。
  
  5 、尽可能少引用单元以减小DLL的大小,特别是不要引用可视化单元,如Dialogs单元。例如一般情况下,我们可以不引用Classes单元,这样可使编译后的DLL减小大约16Kb。
  
  调用技巧
  
  1 、在用静态方法时,可以给被调用的函数或过程更名。在前面提到的C++编写的DLL例子中,如果去掉extern ”C”语句,C++会编译出一些奇怪的函数名,原来的TestC函数会被命名为@TestC$s等等可笑的怪名字,这是由于C++采用了C++ name mangling技术。这个函数名在Delphi中是非法的,我们可以这样解决这个问题:
  
  改写引用函数为
  
  function TestC(i:integer):integer;stdcall;
  external ’Cpp.dll’;name ’@TestC$s’;
  
  其中name的作用就是重命名。
  
  2 、可把我们编写的DLL放到Windows目录下或者Windows/system目录下。这样做可以在external语句中或LoadLibrary语句中不写路径而只写DLL的名称。但这样做有些不妥,这两个目录下有大量重要的系统DLL,如果您编的DLL与它们重名的话其后果简直不堪设想,况且您的编程技术还不至于达到将自己编写的DLL放到系统目录中的地步吧!
  
  调试技巧
  
  1 、我们知道DLL在编写时是不能运行和单步调试的。有一个办法可以,那就是在Run|parameters菜单中设置一个宿主程序。在Local页的Host Application栏中添上宿主程序的名字就可进行单步调试、断点观察和运行了。
  
  2 、添加DLL的版本信息。开场白中提到了版本信息对于DLL是很重要的,如果包含了版本信息,DLL的大小会增加2Kb。增加这么一点空间是值得的。很不幸我们如果直接使用Project|options菜单中Version选项是不行的,这一点Delphi的帮助文件中没有提到,经笔者研究发现,只要加一行代码就可以了。如下例:
  
  library Delphi;
  uses
  SysUtils,
  Classes;
  
  {$R *.RES}
  //注意,上面这行代码必须加在这个位置
  
  function TestDll(i:integer):integer;stdcall;
  begin
  Result:=i;
  end;
  
  exports
  TestDll;
  
  begin
  end.
  
  3 、为了避免与别的DLL重名,在给自己编写的DLL起名字的时候最好采用字符数字和下划线混合的方式。如:jl_try16.dll。
  
  4 、如果您原来在Delphi 1或Delphi 2中已经编译了某些DLL的话,您原来编译的DLL是16位的。只要将源代码在新的Delphi 3或Delphi 4环境下重新编译,就可以得到32位的DLL了
  
  参考文章:在Delphi与C++之间实现函数与对象共享 http://www.zahui.com/html/2/4202.htm
  
  1.C++共享Delphi对象
  
  要实现从C++调用Delphi对象,首先要在Delphi单元的接口部分以及C++的头文件中说明需要共享的对象的接口,在对象接口中定义该对象包含哪些属性与方法,并说明可供共享的部分。对象的共享,关键在于方法的共享。在Delphi语言中,要使一个对象可以被共享,可以把它说明为两个接口部分,暂称为"共享接口"与"实现接口"。其中共享接口指明对象中哪些方法可被另一种语言所共享;实现接口则继承共享接口,并且在单元实现部分针对实现接口中的方法定义具体的实现。要定义一个可供C++共享的Delphi对象,共享接口的说明应注意:
  
  在Delphi程序里,要共享的方法必须被说明为抽象(abstract),而且虚拟(virtual );
  
  在C++程序里,必须用关键字"virtual"及"=0"后缀,把从Delphi共享的方法说明成"pure virtual";
  
  共享的对象方法必须在两种语言里都被说明成相同的调用方式,通常使用标准系统调用方式(stdcall)。
  
  下面,举例说明这些规则,假设有这样的一个Delphi对象:
  TTestObject=class
  procedure Proc1(x:integer);
  function Func1(x:integer):PChar;
  procedure Proc2;
  function Func2:integer;
  end;
  
  如果C++程序需要共享其中的方法Proc1、Func1,可把上述说明修改成以下形式:
  STestObject=class
  procedure Proc1(x:integer); virtual; abstract; stdcall;
  function Func1(x:integer); virtual; abstract; stdcall;
  end;
  TTestObject=class(STestObject)
  procedure Proc1(x:integer);
  fuction Func1(x:integer):PChar;
  procedure Proc2;
  fuction Func2:integer;
  end;
  
  在C++程序中做如下对象原型说明:
  class STestObject {
  virtual void Proc1(int x)=0;
  virtual char *Func1(int x)=0;
  };
  
  为了能在C++中成功地访问Delphi定义的类, Delphi接口说明时必须包含一个可共享的"制造函数(Factory Function)"CreateTestObject,该制造函数可被定义在动态链接库或目标文件(.OBJ)中,例如:
  
  Library TestLib;
  exports CreateTestObject;
  function CreateTestObject:STestObject; stdcall;
  begin
  Result:=TTestObject.Create;
  end;
  …
  end.
  
  经过这样的处理,现在可在C++程序中使用这个由Delphi定义的对象,调用方式如下:
  extern "C" STestObject stdcall *CreateTestObject();
  void UseTestObject(void) {
  STestObject *theTestObject=CreateTestObject();
  theTestObject->Proc1(10);
  Char *str=theTestObject->Func1(0);
  }
  
  当调用制造函数CreateTestObject时,实际上已经在Delphi一侧占用了一个对象实例的空间,C++程序在针对该对象的所有处理完成后必须考虑释放这一空间,具体的实现可在Delphi中定义一个类,如上述Proc1的共享方法Free,以此来完成这一任务:
  STestObject=class
  procedure Proc1(x:integer); virtual; abstract; stdcall;
  function Func1(x:integer); virtual; abstract; stdcall;
 
 
 
Delphi调用C# DLL方法 C#端 新建类库: 想要COM组件能够让Delphi调用必须使用接口形式 使用vs工具生成GUID删除多余的花括号 代码如下: namespace TestDll { public interface ITestClass1 { void YourFunction1(); void YourFunction2(string str); } [ClassInterface(ClassInterfaceType.None)] [Gui 阅读详情

相关推荐

DELPHI DLL注入技术详解与源码实践

DLL注入技术是计算机程序设计中的一项高级技术,它允许开发者将动态链接库(Dynamic Link Library,简称DLL)注入到另一个运行中的进程空间内。这种技术在软件开发、性能监控、安全研究等多个领域有着广泛的应用。本章节将为大家提供一个关于DLL注入技术的概览,包括它的工作原理、使用场景以及技术要点,为深入理解后续章节内容打下基础。DLL注入的原理是利用操作系统的API(应用程序编程接口)函数,将一个DLL文件映射到目标进程的地址空间内,并执行其导出函数,从而实现功能的动态扩展或修改。

weixin_35826166的博客 1111

在Delphi与C++之间实现函数与对象共享

 Delphi以其独特的面向控件的开发方式、强大的数据库功能以及快速的编译技术,使得它自发布起即格外引人注意。随着Delphi 3提供丰富的Internet应用,Delphi日益成为最重要的软件开发工具之一,它吸引了许多原Visual Basic、Foxpro、dBase甚至C++的程序员,而这些程序员使用Delphi时需要解决的一个重要问题就是怎样利用他们原有的代码。本文将介绍Delphi与

蝈蝈俊.net 1798

Delphi中调用及释放DLL的实践案例

本文还有配套的精品资源,点击获取 简介:Delphi,基于Object Pascal语言的IDE,广泛用于开发桌面应用。DLL作为Windows核心组件,使得程序间能共享功能,节省内存,提高效率。本例展示在Delphi中如何正确调用和释放DLL资源。介绍了DLL的导出函数定义、加载、获取函数指针、调用函数以及最终释放DLL的步骤。提供了一个完整的Delphi程序示例,帮助初...

weixin_35671843的博客 1520

Dephi 之DLL技巧汇集

【导读】本文讲解关于Dephi 的DLL一些技巧 在Delphi中静态调用DLL top 调用一个DLL比写一个DLL要容易一些。首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。同样的,我们先举一个静态调用的例子。 unit Unit1; interface uses

SeekMyself的专栏 1855

各种逻辑漏洞

注册:短信轰炸验证码安全问题密码爆破邮箱轰炸用户任意注册、批量注册用户名枚举XSS(有框的地方就可以尝试插XSS)登录:短信轰炸、验证码安全问题、密码爆破、邮箱轰炸SQL注入撞库抓包把password字段修改为空值发送认证凭证替换、比如返回的数据包中包含账号,修改账号就能登录到其他账号Cookie仿冒修改返回包的相关数据,可能会登陆到其他的用户找回密码:短信邮箱轰炸、短信邮箱劫持重置任意用户账户密码、验证码手机用户未统一验证直接跳过验证步骤。

shirlly_的博客 2093

Python海康摄像头SDK二次开发

摘要:为解决海康威视摄像头RTSP拉流延迟严重的问题,本文提出改用海康私有SDK直接取流的方案。通过下载海康设备网络SDK并调用其Python接口,实现了低延迟的视频流获取。文中详细介绍了SDK配置流程,并提供了优化版的Python代码示例,重点解决回调函数处理、队列缓冲和CPU占用等问题。测试结果表明,该方案显著降低了延迟,同时保持了较高的帧率(30FPS以上)和较低的CPU占用率(约2%)。相较于传统OpenCV+FFmpeg的RTSP方案,海康SDK直接取流在实时性方面具有明显优势。

xiaohouzi112233的博客 2608

delphi dll 调用技巧

在Delphi中静态调用DLL top 调用一个DLL比写一个DLL要容易一些。首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。同样的,我们先举一个静态调用的例子。 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, D

猎猎的专栏 1426

Code Ocean 上传代码 手把手教程

对于一些学术期刊,录用前会让把代码上传到Code Ocean上,但上传过程可能会遇到一些问题,小编分享一下自己的上传经验。他们会进行验证,验证通过,将自动发布。点此运行即可,但是运行比较慢。

u014071947的博客 1万+

在Delphi中调用外部DLL 之External DLL 导入DLL

调用一个DLL比写一个DLL要容易一些。首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。同样的,我们先举一个静态调用的例子。 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; pr

wqwqh的博客 3234

ROS2实战:手把手教你用walking机器人仿真实现医院多楼层自动配送(含实时地图切换)

本文详细介绍了如何利用ROS2和walking机器人仿真平台实现医院多楼层自动配送系统,重点讲解了动态地图切换技术和多楼层导航的实现方法。通过实时加载地图和优化电梯过渡策略,解决了医院复杂环境下的自主配送难题,为医疗物流自动化提供了实用解决方案。

weixin_29090917的博客 364

Android 13.0 framework默认沉浸式导航栏功能实现

​ 在13.0的系统rom定制化开发中,在实现导航栏的某些定制化开发中,在某些产品需要实现沉浸式导航栏,就是需要app 能全屏显示同样也能显示导航栏,接下来就来分析下相关的功能实现 ​

安卓兼职framework和app工程师的博客 467

Delphi 中如何调试 DLL

网上看到很多人问delphi中如何调试 DLL 的,众大侠回答也基本一致,但是,我使用时却时灵时不灵,今天发现了原因。完整的调试 DLL方法如下:1)新建一个 DLL 工程,名字就叫 MyDll 吧,编译后生成 MyDll.dll,我们要调试的就是它了。2)新建一个用来调试 MyDll 的 Application 工程,名字就叫 MyDllTest 吧,编译后生成的可执行性文件为 My

老牛(niniu)的专栏 1万+

风控域——决策引擎系统设计

本文详细介绍了风控决策引擎系统的设计与应用。决策引擎系统是一种智能化工具,可自动化、数据驱动地辅助或替代人工决策,广泛应用于金融、医疗、营销、风控等领域。文章阐述了决策引擎的核心功能,包括自动化决策、动态规则管理、实时处理和模型集成,以及系统组成,涵盖数据输入层、规则引擎和模型服务层。此外,还探讨了决策引擎的典型应用场景、技术架构、组件设计,以及风控决策引擎系统的技术方案、设计难点和重点。

庄小焱 3320

delphi 创建dll_从Delphi创建和使用DLL

delphi 创建dll A Dynamic Link Library (DLL) is a collection of routines (small programs) that that can be called by applications and other DLLs. Like units, they contain code or resources that can be sh...

cumao2792的博客 1573

算法 | A*算法实现最优路径规划

启发式探索是利用问题拥有的启发信息来引导搜索,达到减少探索范围、降低问题复杂度的目的。A*寻路算法是启发式探索的一个典型实践,在寻路搜索的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中采取估计值优先原则,估计值更优的节点会被优先遍历。...

不断学习,不断进步,提高自己 6630

GIS数据处理-使用PostGIS+QGIS

GIS数据处理1-使用PostGIS+QGIS 介绍 这里我遇到了一个需求,需要将SQLite的.db数据库中GIS数据导出成shapefile文件 数据库的表结构如下所示,这里存储的是wkt格式的矢量数据 WKT与WKB格式介绍 OpenGIS 规范定义了两种表示空间对象的标准方式:Well-Know Text (WKT) 形式和Well-Known Binary(WKB) 形式。WKT 和 WKB 都包含矢量几何要素的对象类型和构成对象的坐标的信息。WKT可读性强,更方便阅读识别,而在实际数据传输和存

孙霸天的专栏 2528

DELPHI中调用DLL的方法和一些注意事项和技巧

原来的文章很多小问题,不过这篇文章不失是一篇DLL学习基础篇文章。(注:文章中的问题未作任何修改)转摘自:http://hanyi.codelphi.com/jiqiao/26.html第一章 为什么要使用动态链接库(DLL)提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维护升级的重要保证。(举个例子,笔者的Win95 Sys

CrazyCock的专栏 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Delphi中DLL的其他应用

1.DLL的入口函数和出口函数    在编写DLL时可以在DLL项目文件的begin..end之间加入DLL的进入口函数和出口函数,全局变量DLLProc是一个过程指针,指定入口/出口函数,初始值为nil,只需将自己的出入口函数赋值给它即可,自己的出入口函数必须传入一个DWord

fly的专栏 6049

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

用Delphi制作DLL

用Delphi制作DLL  一  Dll的制作一般步骤  二  参数传递  三  DLL的初始化和退出清理[如果需要初始化和退出清理]  四  全局变量的使用  五  调用静态载入  六  调用动态载入  七  在DLL建立一个TForM  八  在DLL中建立一个TMDIChildForM  九  示例:  十  Delphi制作的Dll与其他语言的混合编程中常遇问题:  十一  相关资料   

yuhongwei的专栏 1160

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

delphi 编写dll

开使你的第一个DLL专案 1.File->Close all->File->New﹝DLL﹞ 代码: //自动产生Code如下: ibrary Project2; //这有段废话。 uses SysUtils, Classes; {$R *.RES} begin end. 2.加个Func进来: 代码: library Project...

weixin_30521649的博客 1415

在Delphi中静态调用DLL 引用外部Dll External Dll 导入Dll

在Delphi中静态调用DLL 引用外部Dll External Dll 导入Dll 调用一个DLL比写一个DLL要容易一些。首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。同样的,我们先举一个静态调用的例子。 unit Unit1; interface uses Windows, Messages, SysUtils, ...

achs24540的博客 986

Delphi 7 调用C# 编写的com组件DLL

成功注册了导出到“SMUtilMed\bin\Debug\smutilmed.tlb”的程序集和类型库。查找regasm.exe,一般在.net的目录下,可以直接拷拷贝到生成DLL的目录,方便操作。运行 regasm /tlb:smutilmed.tlb smutilmed.dll。可以选择Create Unit,只生成单元文件并引入项目内,不用安装元件到面板上。运行 gacutil.exe gacutil -I XXXX.dll。生成的引入文件内,应该有对应的方法,如果没有,请检查C#内的各项定义。

bell的专栏 1564

delphi制作dll

一 Dll的制作一般步骤二 参数传递三 DLL的初始化和退出清理[如果需要初始化和退出清理]四 全局变量的使用五 调用静态载入六 调用动态载入七 在DLL建立一个Tform八 在DLL中建立一个TMDIChildform九 示例:十 Delphi制作的Dll与其他语言的混合编程中常遇问题:十一 相关资料一 Dll的制作一般分为以下几步:1 在一个DLL工程里写一个过程或函数2 写...

231

Delphi中DLL的创建和使用

Delphi中DLL的创建和使用      1.DLL简介;   2.调用DLL;   3.创建DLL;   4.两个技巧;   5.初始化;   6.例外处理。              1、DLL简介        DLL是Dynamic-Link   Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图、图标等)。可以认为DLL和EXE基本上是一回事,只是

beyondqd的专栏 776

用Delphi制作DLL的方法

用Delphi制作DLL的方法一 Dll的制作一般步骤二 参数传递三 DLL的初始化和退出清理[如果需要初始化和退出清理]四 全局变量的使用五 调用静态载入六 调用动态载入七 在DLL建立一个TForM八 在DLL中建立一个TMDIChildForM九 示例:十 Delphi制作的Dll与其他语言的混合编程中常遇问题:十一 相关资料一 Dll的制作一般分为以下几步:1 在一个DLL工程里写

我心飞扬 2677
上一篇: DELPHI基础开发技巧
下一篇: Delphi的OverRide、OverLoad和Virtual方法
CKLi
博客等级 码龄22年 51粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值