高级话题:为什么在Dll中不能传递字符串

梅文海 2003-07-22 09:07:48
我在Dll中的定义是这样的:
procedure myFun(ASourceFile:string);
begin
ShowMessage(ASourceFile);
end;


声明:
procedure myFun(ASourceFile:string);StdCall;external "my_dll";

使用:
procedure TForm1.Button2Click(Sender: TObject);
begin
myfun('c:\12.jpg');
end;

运行结果显示一个二进制的数据,根本就不是“c:\12.jpg”,不知大家有没有碰到过这样的问题
...全文
28 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
梅文海 2003-07-22
  • 打赏
  • 举报
回复
同志们,我已经解决了,多谢大家了。
我采用动态内存的方法解决的,我发现了传递数据到动态链接库的一个经验,传递参数时,应该使用有物理地址的方法,不能使用不含有任何地址的参数,比如'abcdefg'等,可能是在传递参数时不拷贝变量所至,如果采用指针的方法,绝对不会有问题的。
  • 打赏
  • 举报
回复
使用PCHAR传递
ahpei 2003-07-22
  • 打赏
  • 举报
回复
在DLL中函数的参数不能是string类型,否则需要加上shareMem单元。
梅文海 2003-07-22
  • 打赏
  • 举报
回复
多谢各位,
我把参数改成PChar后发现可以正常传递,但是出现了新的问题:
调用完成时(Dll已经完成功能),出现严重错误:
Project f:\temp\myTest.exe falulted with message:'access violation at 0x5cad7c2a:read of address 0x5cadc2a'.Process Stopped.Use Step or Run to Continue.
CBJ2049011 2003-07-22
  • 打赏
  • 举报
回复
我在Dll中的定义是这样的:
procedure myFun(ASourceFile:PChar);
begin
ShowMessage(ASourceFile);
end;


声明:
procedure myFun(ASourceFile:PChar);StdCall;external "my_dll";

anh 2003-07-22
  • 打赏
  • 举报
回复
你把这个STRING换成一个PCHAR 就可以了。
zyly2 2003-07-22
  • 打赏
  • 举报
回复
DLL中函数的返回类型不能为String类型,string是自管理型类型。你用PChar试试。如果非要用string型也可,用变参。
dudunono 2003-07-22
  • 打赏
  • 举报
回复
procedure TForm1.Button2Click(Sender: TObject);
begin
myfun(PChar('c:\12.jpg'));
end;
dudunono 2003-07-22
  • 打赏
  • 举报
回复
利用 动态加载试试了
zyly2 2003-07-22
  • 打赏
  • 举报
回复
使用PCHAR传递,STRING是DELPHI中特有的,如果是与VC的程序传递需使用PCHAR,如在DELPHI的程序中传递可用STRING
previewer1024 2003-07-22
  • 打赏
  • 举报
回复
我的DLL是VC做的,也碰到问题(用CString类型),把它改为指针型就好了,你可以试试。
梅文海 2003-07-22
  • 打赏
  • 举报
回复
我又试了一下,我使用一个变量传递数据,结果第一个参数可以传递了,可是出现了第二种情况:传递第二个参数时怎么都不能传递。

var
s:string;
begin
myFun(s,s);

我在上面举的是一个参数的例子,如果改为两个参数的话,第二个参数不能传递
CeleronII 2003-07-22
  • 打赏
  • 举报
回复
不大可能吧,从来没碰到过这样的问题

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧