同为一个Singer.dll中的函数在PB中引用为:
function boolean getserialno(ref string serialno,long size)  library "Signer.dll" alias for "GetSerialNo"
可以正常调用而小弟在Delphi中引用为:
function   getserialno( var serialno:string ; size:longint):boolean;  stdcall; external 'Signer.dll' name 'GetSerialNo';
---------
然后调用函数:procedure TForm1.getserialnobtnClick(Sender: TObject);
var sn:string;
begin
   getserialno(sn,256); 
end;编译通过,但调用总是出错,难道问题在于delphi的sting类型和pb的 ref string 的不同?我也尝试使用过pchar、pansichar代替string,也是同样的问题。但小弟调用其它没有 ref string的函数都是没问题的,请问各位高人如何解决? 
小弟是新手,请各位前辈不吝指点,小弟先谢谢了~

解决方案 »

  1.   

    试着采用Cdecl调用模式看看呢?function GetSerialNo(var SerialNo: String; Size: longint): Boolean; Cdecl; external 'Signer.dll' name 'GetSerialNo';以上纯属猜测……
      

  2.   


    只是返回SerialNo一个值,size只是指定返回值SerialNo的长度~谢谢!
      

  3.   

    procedure TForm1.getserialnobtnClick(Sender: TObject);
    var sn:array[0..256] of AnsiChar;
    begin
      getserialno(sn,256);
    end;
      

  4.   


    function getserialno( var serialno:PChar; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';procedure TForm1.getserialnobtnClick(Sender: TObject);
    var sn:array[0..256] of AnsiChar;
    begin
      getserialno(@sn,256);
    end;
    好像是这样吧,记不清楚了。没法试验。
      

  5.   

    function getserialno( var serialno:PAnsiChar; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';function GetSN: string;
    var
      sn:array [0..256] of AnsiChar;
    begin
      ZeroMemory(@sn,SizeOf(sn)); 
      getserialno(@sn,256);
      result :=sn;
    end;
    buffer是0..256,即257个字节。最后一个永远为0,就怕正好SN是256个,那么这个PChar就不是0结尾了。
      

  6.   


    谢谢您,编译的时候 
    getserialno(@sn,256);  这句提示
    [Error] Unit1.pas(48): Types of actual and formal var parameters must be identical
    麻烦您再帮我看看,非常感谢!!
      

  7.   

     var serialno:PAnsiChar
    这里你改了吗?
      

  8.   

    function getserialno( var serialno:string ; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';
    Delphi调用Dll基本都是PAnsiChar;生命时候就要生命成PAnsiChar;
      

  9.   


    var
      Form1: TForm1;
         Function   initsigner(hwnd:integer):boolean;  stdcall; external 'Signer.dll' name 'InitSigner';
         function   getserialno( var serialno:PAnsiChar ; size:longint):boolean;stdcall; external 'Signer.dll' name 'GetSerialNo';
         function   sign(input:string; var output:string;size:integer; option:integer):boolean ;stdcall;   external   'Signer.dll' name 'Sign';implementation
    {$R *.dfm}function GetSN: string;
      var sn:array [0..256] of AnsiChar;
    begin
      ZeroMemory(@sn,SizeOf(sn));
      GetSerialNo(@sn,256);
      result:=sn;
    end;procedure TForm1.getserialnobtnClick(Sender: TObject);
    begin
      GetSN;
    end;您看,这是源码
      

  10.   

    GetSerialNo(sn,256);这样
    不行就GetSerialNo(sn[0],256);
    没装Delphi,没法试验。
    应该没问题。
      

  11.   

    function getserialno( var serialno:string ; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';
    再不行就把stdcall改成cdecl。
      

  12.   


    改为cdecl也是一样的,我自己乱试了一下,目前只有这样,程序会提示“所提供序列号缓冲太小”,我是新手,实在不知道怎么处理了:( function   getserialno( var serialno:array of string  ; size:longint):boolean;cdecl; external 'Signer.dll' name 'GetSerialNo';procedure TForm1.Button1Click(Sender: TObject);
    var sn:array[0..0] of string;
    begin
      getserialno(sn[0],256);
    end;
      

  13.   

    去掉 var
    function getserialno(serialno:PAnsiChar ; size:longint):boolean;stdcall; external 'Signer.dll' name 'GetSerialNo';
      

  14.   

    function getserialno( var serialno:PAnsiChar ; size:longint):boolean;stdcall; external 'Signer.dll' name 'GetSerialNo';function GetSN: string;
      var sn:PAnsiChar;
    begin
      sn:='';
      GetSerialNo(@sn,256);
      result:=sn;
    end;
      

  15.   

    getserialno(sn,256);  修改成
    getserialno(pchar(sn),256);  
      

  16.   

    谢谢,楼上两位好早啊!~
     我认真试了一下,一执行,程序就关闭,真不知问题在哪里? 而PB调用则可以正确返回Sn值。
      

  17.   

        function getserialno( var serialno:PAnsiChar; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo'; function GetSN: string; var sn:array [0..256] of AnsiChar; begin ZeroMemory(@sn,SizeOf(sn)); getserialno(@sn,256); result :=sn; end;
    buffer是0..256,即257个字节。最后一个永远为0,就怕正好SN是256个,那么这个PChar就不是0结尾了。----
    GetSerialNo(sn,256);这样
    不行就GetSerialNo(sn[0],256);
    没装Delphi,没法试验。
    应该没问题。----谢谢unicodestring大哥,综合了您的帖子,终于测试成功了,原来是这么声明和调用的function   getserialno(  serialno:PAnsiChar  ; size:integer):boolean;  stdcall; external 'Signer.dll' name 'GetSerialNo';function GetSN: string;
      var sn:array [0..256] of AnsiChar;
    begin
      ZeroMemory(@sn,SizeOf(sn));
      GetSerialNo(@sn[0],256);
      result:=sn;
    end;同时谢谢各位热心的朋友,祝好人一生平安!谢谢!
      

  18.   


    字符型在dll中传,最好使用pchar。真要用string,那么就在工程与dll中第一个位置uses ShareMem
      

  19.   


    这样的话,就是你在DELPHI中引用这个DLL的方式就是有问题的