DLL文件函数说明:
VerifyPublicKey(char * RandomM , char *DataOut)
输入函数:
RandomM:主站随机数(8个字节)
输出函数:
DataOut :签名(126个字节)在Delphi中调用,
type
  Buffer1=Array[0..15] of char;
  Ptr1=^Buffer1;
  Buffer2=Array[0..255] of char;
  Ptr2=^Buffer2;
  ...
end;function VerifyPublicKey(RandomM:Ptr1;DataOut:Ptr2):integer;stdcall;External'AA.dll';procedure TForm1.Button1Click(Sender: TObject);
var Flag:integer;
    RStr:Ptr1;
    DStr:Ptr2;
    str:string;
begin
  str:='1234567891234567';//随机数
  RStr:=@str;
  Flag:=VerifyPublicKey(RStr,DStr);
  if Flag=1 then
  begin
    Application.MessageBox('成功!','系统提示',mb_ok);
    Memo1.Lines.Add(DStr^);//显示返回的内容
  end
  else
  begin
    Application.MessageBox('失败!','系统提示',mb_ok);
  end;
end;到执行那个函数时报错(就这句:Flag:=VerifyPublicKey(RStr,DStr);),提示“Access violation at address 1000371E in module 'AA.dll', Write of address 00000000.”,请大家帮我看看,是不是定义的指针类型有问题,或者是赋值有问题,(注:VC写的Dll文件是没问题的,Dll中的函数参数格式也没问题,但没有源码)谢谢!

解决方案 »

  1.   

    function VerifyPublicKey(RandomM:PChar;DataOut:PChar):integer;stdcall;External'AA.dll';procedure TForm1.Button1Click(Sender: TObject);
    var Flag:integer;
      RStr:PChar;
      DStr:PChar;
      str:string;
    begin
      str:='1234567891234567';//随机数
      RStr:=PChar(str);
      Flag:=VerifyPublicKey(RStr,DStr);
      if Flag=1 then
      begin
      Application.MessageBox('成功!','系统提示',mb_ok);
      Memo1.Lines.Add(DStr^);//显示返回的内容
      end
      else
      begin
      Application.MessageBox('失败!','系统提示',mb_ok);
      end;
    end;还是不行,RStr:=PChar(str);这种赋值方法没问题吧?
      

  2.   

    to:Jonix
    需要分配吗?如何分呢?
      

  3.   

    问题解决了。
    type
      Ptr1=PChar;
      Buffer2=Array[0..255] of char;
      Ptr2=^Buffer2;
      ...
    end;function VerifyPublicKey(RandomM:Ptr1;DataOut:Ptr2):integer;stdcall;External'AA.dll';procedure TForm1.Button1Click(Sender: TObject);
    var Flag:integer;
        RStr:Ptr1;
        DStr:Ptr2;
        str:string;
    begin
        str:='1234567891234567';//随机数
        RStr:=PChar(str);
        New(DStr);
        Flag:=VerifyPublicKey(RStr,DStr);
        if Flag=1 then
        begin
            Application.MessageBox('成功!','系统提示',mb_ok);
            Memo1.Lines.Add(DStr^);//显示返回的内容
         end
        else
        begin
            Application.MessageBox('失败!','系统提示',mb_ok);
        end;
        Dispose(DStr);
    end;谢谢各位!