用Delphi编写Dll心得_gamaster的博客-程序员宅基地

技术标签: delphi  string  dll  开发工具  buffer  integer  

使用Delphi编写DLL心得
1。每个函数体(包括exports和非exports函数)后面加 'stdcall;', 以编写出通用的dll
2。exports函数后面必须加'export;'(放在'stdcall;'前面)
3。对于非exports函数可以使用string类型,而且建议使用string类型进行参数传递
4。对于exports函数请使用PChar类型做参数传递
5。如果exports调用其他函数,建议在exports函数体内使用变量过渡,然后再调用其他函数;
 也就是说:尽量不要把exports的参数再作为参数调用其他函数。
6。exports函数中如果有回传参数:如果是非地址型的(如integer,boolean等基本类型)请
 使用var前缀,如果是地址型的请不要使用var前缀(如PChar或数组等)。
 对不使用var前缀要回传的参数请使用内存拷贝类函数,如StrPCopy,CopyMemory,Move等。
 原因:dll和主应用程序并不能很好的共用一块内存,所以必须进行内存拷贝才能正确将dll
 中的内容回传(拷贝)到主应用程序中。也因此对回传的地址标识类参数,在调用dll之前必须
 进行内存分配,例如Delphi中:AllocMem(n integer),Pb中:Space(n long)。
 注意在调用dll处dll函数声明时,若是delphi参数声明同dll中的参数声明(回传地址型的参数无需加
 var),若是pb回传参数必须加ref 前缀。
7。非exports函数的参数必须遵循规则:回传参数加前缀var,你完全可以对待非exports函数同在Delphi应用
 里写函数一样
8。非exports函数中如果有数组参数,无论是否回传,请加var前缀,它是地址调用
9。在dll中布尔型请注意bool和boolean的区别,在调用方环境中将可能引起不同的结果
10。在dll函数中尽量避免使用delphi特有的数据类型或类,如TStringList等
11。减少use列表中不必要单元的引用,以减少dll的大小
12。dll的调试:可以使用showmessage(需use dialogs)来调试,也可以[run]->[Parameters]中配置宿主
 程序来单步跟踪dll的执行情况
13。请注意dll中申请的所有内存必须正确释放,否则dll可能在被调用n次之后会出现地址引用错误
14。在调用dll时候:
    1)运行环境:可以直接放在应用程序同目录下,也可以放在一个文件夹下,如果放在一个文件夹下
 你必须将此文件夹路径设置到环境变量中,你可以在应用程序中设置,也可以在dll中设置:
 var
   PathBuf: array[0..2048] of Char;
   Pathstr: String;
 begin
   FillChar(PathBuf,2048,' ');
   windows.GetEnvironmentVariable('PATH',PathBuf,2048);

   Pathstr:=String(PathBuf);
   Pathstr:=Trim(Pathstr);
   if Pos(lowerCase(AppPath+'tuxedo/dll'),LowerCase(Pathstr))<=0 then
   begin
     Pathstr:=Pathstr+ ';'+AppPath+'tuxedo/dll' ;
     SetEnvironmentVariable('PATH',PAnsiChar(Pathstr));
   end;
 end;
  2)开发环境:若delphi同运行环境没什么区别,它是直接编译生成应用程序,并运行应用程序;
     若PB,必须将dll的路径相对PB的开发工具的应用程序来设置,如放到pb9.0.exe同目录下,
     当然你可以设置[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/App Paths/]
     下面对应你的开发工具的应用程序名称目录下设置dll所在的路径(分号隔开添加既可,不要将原来的路径覆盖)
15。在dll中获取dll的路径:
 var
   Buffer:array [0..255] of char;
   tmpstr:String;
 begin
   GetModuleFileName(HInstance, Buffer, SizeOf(Buffer));
   tmpstr:=ExtractFilePath(Buffer);
   //...
 end;
16。提示信息尽量不要在dll中showmessage,最好是作为信息参数传回,宿主程序再根据结果来进行信息提示,
 这样也可以不引用Dialogs单元。

以上是本人拙见,如有错误敬请指正 QQ:378320654, MSN:[email protected], MAIL:[email protected] 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gamaster/article/details/1383077

智能推荐

waitKey (x)的两个作用_THUNDERSTRUCK的博客-程序员宅基地

waitKey (x)有两个作用:·It waits for x milliseconds for a key press. If a key was pressed during that time, it returns the key’s ASCII code. Otherwise, it returns -1.等待x ms,如果在此期间有按键按下,则立即结束并返回按下按键的ASCII码,否则

【问题解决手记】IDEA出现问题 “Error:java: 无效的源发行版: 1.9”_LanTingShuXu的博客-程序员宅基地

出现 【Error:java: 无效的源发行版: xxxx】 这样的错误一般都是JDK版本和IDEA设置的级别不同导致的。解决办法如下:点击File—&amp;gt;Project Structure… 选中左侧Project选项卡,找到 Project language Level,从下拉框中选中适合你的等级。例如,我的是JDK1.8,我就选 “8”。 好了,问题解决。 ...

音频和视频流最佳选择?SRT 协议解析及报文识别_声网的博客-程序员宅基地

我们所知道 SRT 是由 Haivision 和 Wowza 开发的开源视频流协议。很多人会认为在不久的将来,它被是 RTMP 的替代品。因为 RTMP 协议安全性稍低,延迟相对较高 ,而相对于 SRT 协议支持高质量、稳定性、亚秒级延迟、强大的编解码器支持。SRT 被许多行业专家认为是视频流的新协议。SRT 究竟是什么?什么是 SRT?安全可靠传输 (SRT) 是一种开源数据传输协议。SRT 使用用户数据报协议 (UDP),旨在通过公共互联网发送高质量视频,因此该协议是音频和视频流的最佳选择。在许.

【保理须知】商业保理十大业务模式介绍_商业保理业务模式_VivianHuang001的博客-程序员宅基地

商业保理指由非银行金融机构开展的保理。具体是指销售商将其与买方订立的货物销售(服务)合同所产生的应收账款转让给保理公司,由保理公司为其提供贸易融资、应收账款管理与催收等综合性商贸服务。本文重点讲解商业保理的集中业务模式。商业保理业务模式。一、赊销信用风险管理业务模式赊销实际上是向买方贷款,买方不付款就会形成坏账。因此,卖方签署赊销合同其实就是也是在签署一份信贷合同。在签署合同前,企业应该向银行...

监控器材网站制作_音乐制作教程超全攻略,一篇文章让你轻松玩转 (总整理)_weixin_39783156的博客-程序员宅基地

能够将脑海边一闪而过的灵感记录下来,并添枝加叶,使其丰满成一首脍炙人口或者至少可以自娱自乐的音乐作品,抑或者在某个合适的场合发表或者演唱,从听者的赞扬声中感受到一点点的微薄荣耀,大概是每位音乐或音乐爱好者梦寐以求的渴望吧!​​然而这对于既不精通乐理又不通晓音乐创作设备的一般音乐人或爱好者而言,必将是个不小的难题。本篇文章将从音乐制作基础乐理、软硬件设备、后期制作、演唱等板块,从0到1一步一步协助你...

随便推点

解决:找不到step7 basic。_找不到许可证step7basic_合工大机器人实验室的博客-程序员宅基地

解决方法1.停止automation license manager service服务2.删除授权文件检查你的授权文件夹AX NF ZZ是放在哪个盘,C盘还是D盘,在工具--文件夹选项--查看----选上显示所有文件和文件夹,同时去掉隐藏受保护的操作系统文件(推荐),就能看到里面的内容,可以直接删除,再重新授权,授权时注意只要安装使用的授权就行。3.重新授权4.启动automation license manager service服务1.删除原授权的License:打开.

mui dtPicker使用(设置日期格式)_mui dtpicker 日期_乡野码夫的博客-程序员宅基地

js代码&lt;script&gt; $(".selectDate").click(function() { var dtPicker = new mui.DtPicker({ type: "date", //设置日历初始视图模式 beginDate: new Date(1949, 01, 01), //设置开始日期 endDate: new Date().toLocaleDateString(), //设置结束日期 labels: ['年', '月', '日'], /

C语言:通讯录的文件操作,保存你的联系人到硬盘中吧_c语言实现的通讯录存在哪_Thepale2022的博客-程序员宅基地

C语言通讯录动态内存分配的升级版:文件保存读取。不要停下步伐,胜利就在前方。

bash脚本筛选出根目录下所有ELF文件,并将路径输出_筛选elf文件_Justine__King的博客-程序员宅基地

首先说明下我做这个bash脚本的目的我需要从根目录下筛选出所有ELF文件,并将这类文件的路径整理成一个text文件,逐行读取text文件内的路径,依次将目标文件反汇编,并筛选将符合条件的文件路径输出到另一个text文件中#!/bin/shfind / -type f -exec file {} \; | grep "\" | awk -F ':' '{print $1}' >>ELFfil

推荐文章

热门文章

相关标签