我已用regsrv32将dll注册,接着定义卡结构
 
interface
// 接口定义 接口名称IRWCard
//接口IID {2DD111A-3EC9-4EFE-AFCD-B9FF66EB3456}
//组件名称 CardCOM
  type
    IRWCard = interface(IDispatch)
      ['{2DD111A-3EC9-4EFE-AFCD-B9FF66EB3456}']
    function Read(out Data:OleVariant):WordBool; safeCall;
    //function SetPort(AportID:Byte):WordBool; safeCall;
    end;
//定义卡结构
  Type TDataRec = record
    CardCode: Byte;
    CorpCode: Word;
    CustID: LongWord;
    SumBuy: LongWord;
    Param1: Byte;
    Param2: Byte;
    Param3: Byte;
    Param4: Byte;
    Param5: Byte;
    Param6: Byte;
    Param7: Byte;
    end;
之后,后来调用读方法:
procedure TfrmReadCard.btnWrCardClick(Sender: TObject);
//const
  //IID_IMalloc: TGUID = '{2DD1EE3A-3EC9-4F5E-A9CD-B98366EB3456}';
var
  MCard :OleVariant;
  CustID: OleVariant;
  iter: IRWCard;
begin
 // iter := CreateComObject(IID_IMalloc);
 // IRWCard.SetPort(4);
  MCard:=iter.Read(CustID);  //Memo1.Lines.Add(MCard);
end;  提示错误
   read Of address '00000000'

解决方案 »

  1.   

    你直接把COM导入应该就可以了啊;?自动生成了接口声明
      

  2.   

    把COM 导入了,然后我这样调用读方法
    procedure TfrmReadCard.btnWrCardClick(Sender: TObject);
    var
      MCard :OleVariant;
      CustID: OleVariant;
      iter: IRWCard;
    begin
      MCard:=iter.Read(CustID);
    end;发现CustID的地址总是为0
      

  3.   

    outer2000:Read(out Data:OleVariant)方法:OleVariant为卡数据接口的varArrayArray形式。读取成功返回True,且读出数据存放于变量Data中,调用失败返回Fasle,Out中数据无效!
      

  4.   

    先用regsrv32将dll注册,后来在Project里用import Type library注册组件CradCOM ,
    还是同样的错误!
      

  5.   


    可以使用函数了,uses RWCardCom_TLB就可以;以下是我的读卡程序:
    procedure TfrmMakeCard.btnReadCardClick(Sender: TObject);
    var
      CardCode: OleVariant;
      CustID: OleVariant;
      CardInfo: TDataRec;
      Iner: IRWCard;
    begin
      Iner:=CoPortObject.Create;
      if Iner.SetPort(0) then    //监测是否是端口COM1,如果是就返回true,否则调用getErrorInfo失败的原因
      begin
        if Iner.Read(CardCode)=True then
        begin
          memo1.Lines.add(CardCode);//将卡数据显示在memo1中,卡数据为长度56位16进制字符串!
        end
        else
          Iner.GetErrorInfo;
      end
      else
        Iner.GetErrorInfo;
    end;