dll结构
type
  TCardInfo = packed record // the Communication Block used in both parts (Server+Client)
    consequence: Integer; //标志
     H_cardsn: array[0..9] of char; //卡序列号
    Name: array[0..15] of char; //姓名
    Sex: array[0..1] of char; //性别
  end;
 pCardInfo = ^TCardInfo;函数
function ReadCard1(var tag_: Integer; RCardInfo:pCardInfo): integer; stdcall;
begin
   getMem(_pCardInfo, sizeof(TCardInfo));
  
    _pCardInfo^.consequence := 0;
    StrPCopy(_pCardInfo^.H_cardsn, '0000FFFFFF');//卡序列号
    StrPCopy(_pCardInfo^.Name, '张三'); //姓名
    StrPCopy(_pCardInfo^.Sex, '男'); //性别
   
    RCardinfo := _pCardInfo;
    freemem(_pCardInfo);
end;现在我要在主程序中调用DLL
function ReadCard1(tag_: Integer; RCardInfo: pCardInfo): integer; stdcall; external 'ReadCard.dll' name 'ReadCard1';
procedure TForm1.btn1Click(Sender: TObject);
var i: Integer;
  str: string;
 CardInfo: TCardInfo;
begin
  try
    ReadCard1(0, @CardInfo);
    edt3.Text := string(CardInfo.H_cardsn);
  except
    on e: exception do
      showmessage(e.Message);
  end;
end;
现在主程序调用时提示‘read of address 00000000’
请问我上面的DLL程序和主程序是否都写的正确,不知为何会出错。求解。谢谢
我是想在主程序中取出DLL中返回的结构中的值,请问该如何做?

解决方案 »

  1.   

    你的pCardInfo要由调用者分配和释放内存
      

  2.   

    按我写的改, 你先试试
    function ReadCard1(var tag_: Integer; RCardInfo:pCardInfo): integer; stdcall;
    begin
      if Assigned(RCardInfo) then 
      begin   
        RCardInfo^.consequence := 0;
        StrPCopy(RCardInfo^.H_cardsn, '0000FFFFFF');//卡序列号
        StrPCopy(RCardInfo^.Name, '张三'); //姓名
        StrPCopy(RCardInfo^.Sex, '男'); //性别
        Result:= 0; 
      end
      else begin
        result:= -1;
      end;
    end;你调用的那段代码就不要改了, 就那么写
      

  3.   

    edt3.Text := string(CardInfo.H_cardsn);
    这段代码也不要加string强制转换
      

  4.   

    var
      RCardInfo: TCardInfo;
    调用:
      ReadCard1(0, @RCardInfo);另:把ReadCard1里面的 getMem和 freemem去掉
      

  5.   

    谢谢,上面的方法的确可以了,但是我放到程序中运行后在主程序成功调用并取出结果运行结束后总是报
    access violation at address 30323130.read of address 30323130 的错误,不知是什么原因。跟踪后发现整个程序段已经运行完了。都END结束了,可以就在跳出END的时候报错了,不知为什么?
      

  6.   

    对了,我还想问下,我在主程序里面需要用getMem分配内存吗?因为现在整个程序主程序和DLL中都没有分配内存,这样会不会不好啊!
      

  7.   

    就你示例里的代码, 我觉得不需要分配内存, 完全可以用栈上的数据, 因为你没有在函数外面再使用这个数据了, 如果在函数外还需要使用该数据, 那么你就得自己getmem freemem了, 按照kk的建议做就对了