关于Delphi中的DLL ( 积分: 50 )

  • 主题发起人 主题发起人 zhi_dian
  • 开始时间 开始时间
Z

zhi_dian

Unregistered / Unconfirmed
GUEST, unregistred user!
DLL中是不是不能传String,那如果一定要传,应该怎么解决??
 
DLL中是不是不能传String,那如果一定要传,应该怎么解决??
 
//传String 是可以的,不过在 调用和DLL的单元中都要加入
//这样就非Delphi的环境下就可能不可以调用 这个DLL的了
uses
ShareMem,

//
//不过我建议不要传送 String 参数,全都改成传 PChar 的参数,就可以了
//接收入再进行类型传换就可以

//有什么不明可以问我,我自认为对DLL的认识还是有一点的
 
function Untie(pwd1:string):string;
var i:integer;
pwd2:string;
begin
pwd2:='';
i:=1;
while i<=length(pwd1) do
begin
pwd2:=pwd2+chr(trunc(ord(pwd1)/2)+ord(pwd1[i+1])-48);
i:=i+2;
end;
result:=pwd2;
end;
那我这个该怎么改?
 
定义
function Untie(pwd1: PChar):PChar;
var i:integer;
pwd2:string;
TempPwd1 : String;
begin
if pwd1 = Nil then
TempPwd1 := ''
else
TempPwd1 := String(pwd1);
pwd2:='';
i:=1;
while i<=length(pwd1) do
begin
pwd2:=pwd2+chr(trunc(ord(pwd1)/2)+ord(pwd1[i+1])-48);
i:=i+2;
end;
result:= PChar(pwd2);
end;
 
TempPwd1
这有什么用??
 
再定义DLL接口函数时,最好是在定义是 加上 SafeCall

如function Untie(pwd1: PChar):PChar
SafeCall;

动态调用时也进行相同的定义
这样主程序就可以接收到 DLL程序的出错信息
 
我怎么传到DLL里,pwd1变成空了??
 
把你的调用方式和调用代码Copy出来看看
 
unit testdll;
interface
function Untie(pwd1:pchar):pchar;
implementation
function Untie
external 'unties.dll';
end.
 
uses testdll;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit2.Text:=string(Untie(pchar(edit1.Text)));
end;
 
调用代码呢?
 
就是这样了啊
 
可以传String 只要内容不长,不用uses ShareMem
 
定义
function Untie(pwd1: PChar):PChar;
var
i:integer;
pwd2:string;
TempPwd1 : String;
begin
if pwd1 = Nil then
TempPwd1 := ''
else
TempPwd1 := String(pwd1);

pwd2:='';
i:=1;
while i<=length(TempPwd1) do
begin
// 不好意思,,, 这里不记的修改
pwd2:=pwd2+chr(trunc(ord(TempPwd1)/2)+ord(TempPwd1[i+1])-48);
i:=i+2;
end;
result:= PChar(pwd2);
end


把你的 pwd1 全都改成 TempPwd1 了,,原来还有地方未改,不好意思了

参数值是 'Edit1'
返回值是 'Vv'
不知有没有错呢?
 
不行的,会有“错误指针操作”的提示的
 
把你的 pwd1 全都改成 TempPwd1 了,,原来还有地方未改,不好意思了
 
哦,好象是这样的,谢谢啦!
下次再有DLL方面的问题,再请教你!
[:)]
 
To goodlife
还是有问题啊~~~~!
现在调用时出现
Access violation at address 0040400F in module 'project1.exe'.Read of address 00DC00C.
的错误提示!
 
后退
顶部