• 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(nlong)。  注意在调用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所在的路径(分号隔开添加既可,不要将原来的路径覆盖) 
    在dll中获取dll的路径: 
    var Buffer:array [0..255] of char; tmpstr:String; begin GetModuleFileName(HInstance, Buffer, SizeOf(Buffer)); tmpstr:=ExtractFilePath(Buffer); //... end;
    提示信息尽量不要在dll中showmessage,最好是作为信息参数传回,宿主程序再根据结果来进行信息提示,  这样也可以不引用Dialogs单元

  • 相关阅读:
    Latex文件如何拆分进行独立编译?
    梯度下降优化算法
    Google大脑科学家贾杨清(Caffe缔造者)-微信讲座
    Jeecg 如何执行批量insert或者update操作,高效率
    【JEECG_3.7.1】列表多表头的设计
    t:formvalid中定义callback函数
    Excel导入的时候日期格式会变成double式的String数据处理
    sql 跨表修改的方式
    js判断字符串str是否包含字符串substr
    帆软报表和jeecg的进一步整合--ajax给后台传递map类型的参数
  • 原文地址:https://www.cnblogs.com/maweiwei/p/13728334.html
Copyright © 2020-2023  润新知