那个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编写的加密狗的加密程序该咋写啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)