delphi编写dll心得, 谢谢原作者的分享。转
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单元。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gzhubin/archive/2008/07/01/2603190.aspx
delphi编写dll心得, 谢谢原作者的分享。转的更多相关文章
- 分享一次C#调用Delphi编写Dll程序
1.前言: 最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C ...
- Delphi 编写DLL动态链接库文件的知识
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
- Delphi 编写DLL动态链接库文件的知识和样例(有详细步骤,很清楚)
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
- Delphi编写DLL供C#调用的实例
Delphi中编写的Dll: library TestDLL; { Important note about DLL memory management: ShareMem must be the f ...
- delphi编写与调用DLL(delphi7下测试通过)
http://blog.sina.com.cn/s/blog_4dbbf76f01000anz.html delphi编写DLL 下面在delphi中编写一个简单的dll,在该dll中只有一个max函 ...
- nodejs调用delphi编写的dll
公司的业务需要,nodejs要读取文件版本号. 同事要求我用delphi编写dll,以供nodejs调用,结果通过json返回. delphi代码如下: function GetFileInfo(AP ...
- Delphi调用C# 编写dll动态库
Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...
- [JNA系列]Java调用Delphi编写的Dll之JNA使用
介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...
- Qt调用Delphi编写的COM组件
这个问题捣鼓了两天,现在终于解决了,做个笔记分享给大家,以免走弯路 起初,我的想法是在DLL中写一个interface并从函数中导出这个interface,像这样的代码 ICom1 = interfa ...
随机推荐
- Hbase设计实战
Hbase设计实战 本文通过一个游戏公司客户实际案例的讲解,分析了 Hbase 表设计及开发在实际案例中的运用,对比了不同的 Hbase 设计考量对客户端访问模式及检索性能的差异.读者通过案例中 Hb ...
- hdu 4540 威威猫系列故事——打地鼠 dp小水题
威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- SKTransition类
继承自 NSObject 符合 NSObject(NSObject) 框架 /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0 ...
- Android 自定义CheckBox样式
1.首先在drawable文件夹中添加drawable文件checkbox_style.xml. <selector xmlns:android="http://schemas.and ...
- Linux与JVM的内存关系分析
引言 在一些物理内存为8g的server上,主要执行一个Java服务,系统内存分配例如以下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m. 从表面 ...
- Xcode7 国际化
1.第一步 HaiTing_xcodeproj.png 2.第二不 HaiTing_xcodeproj 2.png 3.第三步 Localizable_strings.png 5第五步 ZLBMeVi ...
- Linux查看硬件信息以及驱动设备的命令
用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查 ...
- 九宫重拍(bfs + 康拓展开)
问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
- php获取某个目录下面文件的内容
if(!defined('PATH'))define('PATH', dirname(dirname(__FILE__)).'/');ini_set ( 'include_path', '.:' . ...
- new关键字在虚方法的动态调用中的阻断作用
关于new关键字在虚方法动态调用中的阻断作用,也有了更明确的理论基础.在子类方法中,如果标记 new 关键字,则意味着隐藏基类实现,其实就是创建了与父类同名的另一个方法,在编译中这两个方法处于动态方法 ...