外部函数的参数为string时该如何使用?为何总是无法访问?(100分)

  • 主题发起人 主题发起人 ahhlian
  • 开始时间 开始时间
A

ahhlian

Unregistered / Unconfirmed
GUEST, unregistred user!
调用时声明:
function concrete_bar(FileName:string):real;external 'acs.dll';

acs.dll中声明为
function concrete_bar(FileName:string):real;stdCall;

参数到底是如何传递的,请高手指点!
 
如果DLL输出的过程或函数带有长字符类型的参数,或者函数返回类型是长字
符串或带有长字符串元素的构造类型,Object Pascal规定无论是DLL还是调
用它的程序必须把ShareMem单元加到Uses部分。而ShareMem单元是从
DelphiMM.DLL这个DLL中引入的接口单元,因此这种程序分发时必须带有
DelphiMM.DLL。Delphi建议为了避免使用DelphiMM.DLL,传递字符串信息时使
用PChar或ShortString类型参数。
 
楼上说的在理
但为什么一个是stdcall而另一个不是呢?
 
dll中参数和返回值不能用string。
而是指向string的指针。
function concrete_bar(FileName:PChar):real;external 'acs.dll';
 
stdcall是一种调用方式,表示参数从右到左,
Delphi共有5种调用方式,register,cdcel,pascal,stdcall,safecall.除了register,pascal
从左到右外,其余三种都是从右到左。
而函数调用方式的选择,有以下3条规则。
1.Delphi使用register方式作为缺省调用方式以提高运行效率。
2.如是要调用关系的几个模块是有不同的语言编写的,其接口应使用stdcall方式。
3.如果要实现双接口函数和过程,应使用safecall方式。
 
外部函数一般用pchar类型做参数:
function concrete_bar(FileName:pchar):real;external 'acs.dll';
wjiachun 说的有道理,请将sharemem加到uses前面

 
to wjiachun:
我在uses中加入sharemem后问题依然存在,debug时传递过来的参数filename的值为inaccessible value,
我试过改用pchar型,但仍不行,传过来的参数竟然为'佞t',该怎办?我的参数是用来存盘以此为文件名。
 
接受答案了.
 
后退
顶部