dll:
function readcard(buffer: PChar; bufferlen: integer): integer;
var
  s,f: String;
begin
   icdev:=rf_init(initcom,115200);              
   if icdev<=0 then
   begin
     result:=-1;
     exit;
   end;
   sector:=1;
   block:=4;
   loadmode:=0;
   st:=rf_card(icdev,1,@snr); 
   st:=rf_read(icdev,block,@databuff);  //读取卡中数据
   if st<>0 then
   begin
      st:=rf_exit(icdev);
      result:=0;
      Exit;
   end else
   begin
     S := Format('%s',[databuff]);
     result := length(s);//min(length(s),bufferlen);
     StrPLCopy(buffer,databuff,result);
     f := Format('%s',[buffer]);
     ShowMessage(f);   //有数据
     st:=rf_exit(icdev);
   end;
end;
call dll:
var
  ibuff,ikh: String;
  ilen: Integer;
  HInst: THandle;
  readcard: function(buffer: PChar; bufferlen: integer): integer;
begin
    HInst:=LoadLibrary('MemberCard.dll');
    try
      if HInst >0 then
      begin
        @readcard:=GetProcAddress(HInst,'readcard');
        if @readcard<>nil then
        begin
          ibuff := '';//stringofchar(' ',11);
          ilen := readcard(pchar(ibuff),11);
          ShowMessage(IntToStr(ilen)); //数据为11,11位数据没错
          if ilen = -1 then
            ShowMessage('串口打开失败!')
          else if ilen > 0 then
            ikh:= copy(ibuff,1,ilen)
          else
            showmessage('读卡失败!');
        end;
        ShowMessage(ibuff);  //这有问题,没数据??????????
        ShowMessage(ikh);  //没数据
      end else
        ShowMessage('MemberCard.dll文件不存在!');
    finally
      FreeLibrary(HInst);
    end;
end;
不知错在那里,帮忙解决下,谢谢!

解决方案 »

  1.   

    没仔细看:
    readcard: function(buffer: PChar; bufferlen: integer): integer;stdcall;起码后边应该加上调用约定
      

  2.   

    buffer不应该用String这样就行了:
    var
      ibuff,ikh: array[0..11] of char;
      

  3.   

    readcard: function(buffer: PChar; bufferlen: integer): integer;stdcall;
      

  4.   

     if @readcard<>nil then
      begin
      ibuff := '';//stringofchar(' ',11);这行会导致问题
      ilen := readcard(pchar(ibuff),11);应改为ibuff=AllocMem(20);//大于11就应该可以了。
    或者ibuff := '           ';长度应不小于11。
      

  5.   

    没有看清楚,ibuff不要用string类型,改为PCHARilen := readcard(pchar(ibuff),11);//不要强制转换,这样可能会有问题。
      

  6.   

    需要为ibuff分配内存:
      SetLength(ibuffer, 12);
      ilen := readcard(@ibuffer[1],11)