动态链接库的接口如下:
library WM_IC;uses
    classes,SysUtils,
    accesscard in 'accesscard.pas';{$R *.res}experts
    wm_create_sset;beginend.//////////////////////////////////
主调程序中声明如下:(因参数太多,所以省略了没写出来)
function wm_create_sset(....):boolean;stdcall;far;external 'WM_IC.dll' name 'wm_create_sset';该函数在'accesscard.pas'中声明实现.
///////////////////////
调用
procedure TForm1.Button1Click(Sender: TObject);
begin
wm_create_sset(0,'abcd','ffffffff',2,90.2,3,3,5.5,10,10,10,10);
end;
该调用方式会出错!
但是采用下面这种调用方式则没有问题.
动态链接库的接口如下:
library WM_IC;uses
    classes,SysUtils,
    accesscard in 'accesscard.pas';{$R *.res}procedure wm;
begin
wm_create_sset(0,'abcd','ffffffff',2,90.2,3,3,5.5,10,10,10,10);
end;experts
    wm;beginend./////////////////
主调函数中声明如下;
procedure wm;stdcall;far;external 'WM_IC.dll' name 'wm_create_sset';///////////////
调用
procedure TForm1.Button1Click(Sender: TObject);
begin
   wm;
end;这是为什么啊?我想直接采用前一种方式,由主调函数将参数传给wm_create_sset;

解决方案 »

  1.   

    参数类型,是成败的关键,你怎么能省略不写上来呢?
    不要用string参数,可以用pchar代替。
      

  2.   

    楼上说的没错
    参数类型与delphi的字符串内存管理机制有关
    最好使用pchar
    如果使用string, 须在dll和引用端的工程文件的头部 
    uses ShareMem , ...
      

  3.   

    哦,我的确用了string类型的参数.
    我的参数列表是:
    port:integer;
    syscode:string;
    syskey:string;
    meter_kind:byte;
    pre_charge:single;
    pre_count:cardinal;
    user_kind:byte;
    alarm:single;
    allowhoard:single;
    allowdredit:single;
    showtime:byte;
    valvetime:byte
    谢谢楼上各位的帮助!哈哈我先去试试!
      

  4.   

    那就要引用ShareMem 了,还得都放在工程引用的第一个才行!
      

  5.   

    我照着楼上的说法试过了,但还是不行.
    我在dll和调用程序中都引用了ShareMem
    当我如下调用时,会出错:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      wm_create_sset(0,'abcd','ffffffff',2,90.2,3,3,5.5,10,10,10,10);
    end;
    但是这样调用时不会报错:
    procedure TForm1.Button1Click(Sender: TObject);
    var
       str1,str2:string;
    begin
      str1:='abcd';
      str2:='ffffffff';
      wm_create_sset(0,str1,str2,2,90.2,3,3,5.5,10,10,10,10);
    end;
    使用这种方式时,字符串'abcd'和'ffffffff'无法通过str1,str2传入wm_create_sset内部(我在wm_create_sset内部showmessage(str1)时,显示的是空字符串),这是为什么啊?