delphi写得DLL如何像易语言那样返回一串文本

delphi写得DLL如何像易语言那样返回一串文本,第1张

那个MIT1208说的明显是错误的,菜鸟帮菜鸟,Delphi里面,String是不允许作为返回值的。

除非增加了BorlandMMdll,不过不推荐用String作为返回值。至于为什么,你可以去看看有关String的解释。

在dll里面返回String一般是采用内存块返回的方法。

procedure returnStr(str:PAnsichar);

var

s:string;

begin

s:="返回值";

str:=allocmem(7);

strpcopy(str,s,length(s));

end;

///主程序

var

str:pansichar;

begin

returnStr(str);

ShowMessage(str);

free(str);

end;

好久没用Delphi了,有些函数的参数忘了顺序,以上代码盲写的,没有测试过,只是演示一下参数传递。最关键的就是在dll里面分配内存,主程序释放。

你有没有仔细看?什麽叫垃圾内容?没仔细看不要瞎下结论

你所谓的等号後面的,不就是关键字的值吗?

下面自己看

四、读取关键字的值

针对INI文件支持的字符串、整型数值、布尔值三种数据类型,

TINIfiles类提供了三种不同的对象方法来读取INI文件中关键字的值。

假设已定义变量vs、vi、vb分别为string、integer、boolean类型。

vs:=myinifileReadstring

('小节名','关键字',缺省值);

vi:=myinifileReadinteger

('小节名','关键字',缺省值);

vb:=myinifileReadbool

('小节名','关键字',缺省值);

INI文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,

所以可视化的编程一族,如VB、VC、VFP、Delphi等都提供了读写INI文件

的方法,其中Delphi中 *** 作INI文件,最为简洁,这是因为Delphi3提供了

一个TInifile类,使我们可以非常灵活的处理INI文件。

一、有必要了解INI文件的结构:

;注释

[小节名]

关键字=值

INI文件允许有多个小节,每个小节又允许有多个关键字,“=”后面是

该关键字的值。

值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文

件中时没有引号,布尔真值用1表示,布尔假值用0表示。

注释以分号“;”开头。

二、定义

1、在Interface的Uses节增加IniFiles;

2、在Var变量定义部分增加一行:

myinifile:Tinifile;

然后,就可以对变量myinifile进行创建、打开、读取、写入等 *** 作了。

三、打开INI文件

myinifile:=Tinifilecreate('programini');

上面这一行语句将会为变量myinifile与具体的文件programini建立联

系,然后,就可以通过变量myinifile,来读写programini文件中的关

键字的值了。

值得注意的是,如果括号中的文件名没有指明路径的话,那么这个

Programini文件会存储在Windows目录中,把Programini文件存储在应

用程序当前目录中的方法是:为其指定完整的路径及文件名。下面的两

条语句可以完成这个功能:

Filename:=ExtractFilePath(Paramstr

(0))+'programini';

myinifile:=TinifileCreate(filename);

四、读取关键字的值

针对INI文件支持的字符串、整型数值、布尔值三种数据类型,

TINIfiles类提供了三种不同的对象方法来读取INI文件中关键字的值。

假设已定义变量vs、vi、vb分别为string、integer、boolean类型。

vs:=myinifileReadstring

('小节名','关键字',缺省值);

vi:=myinifileReadinteger

('小节名','关键字',缺省值);

vb:=myinifileReadbool

('小节名','关键字',缺省值);

其中缺省值为该INI文件不存在该关键字时返回的缺省值。

五、写入INI文件

同样的,TInifile类也提供了三种不同的对象方法,向INI文件写

入字符串、整型数及布尔类型的关键字。

myinifilewritestring('小节名','关键字',变量或字符串值);

myinifilewriteinteger('小节名','关键字',变量或整型数值);

myinifilewritebool('小节名','关键字',变量或True或False);

当这个INI文件不存在时,上面的语句还会自动创建该INI文件。

六、删除关键字

除了可用写入方法增加一个关键字,Tinifile类还提供了一个删

除关键字的对象方法:

myinifileDeleteKey('小节名','关键字');

七、小节 *** 作

增加一个小节可用写入的方法来完成,删除一个小节可用下面的

对象方法:

myinifileEraseSection('小节名');

另外Tinifile类还提供了三种对象方法来对小节进行 *** 作:

myinifilereadsection('小节名',TStrings变量);可将指定小节中的

所有关键字名读取至一个字符串列表变量中;

myinifilereadsections(TStrings变量);可将INI文件中所有小节名读

取至一个字符串列表变量中去。

myinifilereadsectionvalues('小节名',TStrings变量);可将INI文件

中指定小节的所有行(包括关键字、=、值)读取至一个字符串列表变

量中去。

八、释放

在适当的位置用下面的语句释放myinifile:

myinifiledistory;

九、一个实例

下面用一个简单的例子(如图),演示了建立、读取、存贮INI文件的方

法。myiniini文件中包含有“程序参数”小节,和用户名称(字符串

)、是否正式用户(布尔值)和已运行时间(整型值)三个关键字。

程序在窗体建立读取这些数据,并在窗体释放时写myiniini文件。

附源程序清单

unitUnit1;

interface

uses

Windows,Messages,SysUtils,Classes,Graphics,

Controls,Forms,Dialogs,inifiles,StdCtrls,ExtCtrls;

type

TForm1=class(TForm)

Edit1:TEdit;

CheckBox1:TCheckBox;

Edit2:TEdit;

Label1:TLabel;

Label2:TLabel;

Timer1:TTimer;

Label3:TLabel;

procedureFormCreate(Sender:TObject);

procedureFormDestroy(Sender:TObject);

procedureTimer1Timer(Sender:TObject);

private

{Privatedeclarations}

public

{Publicdeclarations}

end;

var

Form1:TForm1;

implementation

var

myinifile:TInifile;

{$RDFM}

procedureTForm1FormCreate(Sender:TObject);

var

filename:string;

begin

filename:=ExtractFilePath(paramstr(0))+'myiniini';

myinifile:=TInifileCreate(filename);

edit1Text:=myinifilereadstring

('程序参数','用户名称','缺省的用户名称');

edit2text:=inttostr(myinifilereadinteger

('程序参数','已运行时间',0));

checkbox1Checked:=myinifilereadbool

('程序参数','是否正式用户',False);

end;

procedureTForm1FormDestroy(Sender:TObject);

begin

myinifilewritestring('程序参数','用户名称',edit1Text);

myinifilewriteinteger('程序参数','已运行时间',

strtoint(edit2text));

myinifilewritebool('程序参数','是否正式用户',

checkbox1Checked);

myinifileDestroy;

end;

procedureTForm1Timer1Timer(Sender:TObject);

begin

edit2Text:=inttostr(strtoint(edit2text)+1);

end;

end

{unit JxcPz;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Db, ADODB,inifiles;

const

C1 = 42578; // 常量说明

C2 = 62541; // 此二常量用于生成随机数

type

TJxcPzw = class(TForm)

grp1: TGroupBox;

lbl1: TLabel;

lbl2: TLabel;

edt_name: TEdit;

edt_mm: TEdit;

btn_cj: TButton;

btn_close: TButton;

adocon: TADOConnection;

lbl3: TLabel;

edt_yfmc: TEdit;

procedure btn_closeClick(Sender: TObject);

procedure btn_cjClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

JxcPzw: TJxcPzw;

implementation

{$R DFM}

function Encrypt(S:String;Key:Word):String;

var { 加密子程序 }

I,j:Integer; // 用于循环

begin

Result:=S; // 初始化结果字符串

for I:=1 to Length(S) do // 依次对字符串中的各个字符进行 *** 作

begin

Result[I]:=char(byte(S[I]) xor (Key shr 8)); // 将密匙移位后与字符异或

Key:=(byte(Result[I])+Key)C1+C2 // 产生下一密匙

end;

S:=Result; // 保存结果

Result:=''; // 清除结果

for I:=1 to Length(S) do // 对加密结果进行转换

begin

j:=Integer(s[i]); // 提取字符

Result:=Result+Char(65+(j div 26))+Char(65+(j mod 26));

end;

end;

function Decrypt(S:String;Key:Word):String;

var { 解密子函数 }

I,j:Integer;

begin

Result:=''; // 清除结果

for I:=1 to (length(S) div 2) do

begin

j:=(Integer(S[2i-1])-65)26;

j:=j+(Integer(S[2i])-65);

Result:=Result+Char(j);

end;

S:=Result;

for I:=1 to Length(S) do

begin

Result[I]:=Char(byte(S[I]) xor (Key shr 8));

Key:=(byte(S[I])+Key)C1+C2;

end;

end;

procedure TJxcPzwbtn_closeClick(Sender: TObject);

begin

ApplicationTerminate;

end;

procedure TJxcPzwbtn_cjClick(Sender: TObject);

var

inijxc: tinifile;

servernamejxc, usernamejxc, passwordjxc, connjxc,yfmcjxc: string;

begin

try

if trim(edt_nameText) = '' then

begin

ApplicationMessageBox('服务器名称不能为空!', '系统配置', MB_OK + MB_ICONWarning);

edt_nameSetFocus;

exit;

end;

if trim(edt_mmText) = '' then

begin

ApplicationMessageBox('数据库密码不能为空!', '系统配置', MB_OK + MB_ICONWarning);

edt_mmSetFocus;

exit;

end;

edt_nameEnabled := false;

edt_mmEnabled := false;

edt_yfmcEnabled:=false;

btn_cjEnabled := false;

inijxc := TINIFileCreate(ExtractFilePath(applicationExeName) + 'inijxcini');

inijxcWriteString('server', 'name', '' + edt_nametext + '');

inijxcWriteString('server', 'user', 'sa');

inijxcWriteString('server', 'pass', '' + encrypt(edt_mmtext,66) + '');

inijxcWriteString('server', 'yfmc', '' + edt_yfmctext + '');

ADOConclose;

servernamejxc := inijxcReadString('server', 'name', '');

usernamejxc := inijxcReadString('server', 'user', '');

passwordjxc := inijxcReadString('server', 'pass', '');

yfmcjxc := inijxcReadString('server', 'yfmc', '');

connjxc := 'Provider=SQLOLEDB1;Password=' + decrypt(passwordjxc,66) + ';Persist Security Info=True;User ID=' + usernamejxc + ';Initial Catalog=yygl;Data Source=' + servernamejxc;

ADOConConnectionString := connjxc;

ADOConOpen;

ApplicationMessageBox('配置创建成功!', '创建配置', 0);

exit;

except

begin

ApplicationMessageBox('数据库连接失败,请检测数据库密码及设置!', '系统服务配置', 0);

btn_cjEnabled := true;

edt_nameEnabled := true;

edt_mmEnabled := true;

edt_yfmcEnabled:=True;

exit;

end;

inijxcFree;

end;

end;

end

关于pascal的嵌入式开发教程,确实很少。但pascal语言是对汇编支持非常好的高级语言,用它来作为嵌入式开发没有难度、没有什么特殊的技术和要求,所以没有专门的教程也就容易理解了!

在delphi中支持内嵌汇编(包括汇编程序块、汇编函数子程序、汇编过程体子程序),应该是支持嵌入式开发的,比如数据采集、自动控制等。

如果是对实时控制要求较高的且是X86的环境,建议使用msdos+turbopascal做嵌入式开发。

以上就是关于delphi写得DLL如何像易语言那样返回一串文本全部的内容,包括:delphi写得DLL如何像易语言那样返回一串文本、简单的DELPHI问题、用Delphi编写的加密狗的加密程序该咋写啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10122419.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存