调用com写的dll方法,实现读IC卡数据的程序

OceanWave 2003-05-18 08:50:51
我已用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'
...全文
80 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
OceanWave 2003-05-21
  • 打赏
  • 举报
回复
怎么返回值是个‘?’号!
OceanWave 2003-05-21
  • 打赏
  • 举报
回复

可以使用函数了,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;
OceanWave 2003-05-19
  • 打赏
  • 举报
回复
先用regsrv32将dll注册,后来在Project里用import Type library注册组件CradCOM ,
还是同样的错误!
888888888888 2003-05-18
  • 打赏
  • 举报
回复
关注
OceanWave 2003-05-18
  • 打赏
  • 举报
回复
outer2000:

Read(out Data:OleVariant)方法:OleVariant为卡数据接口的varArrayArray形式。读取成功返回True,且读出数据存放于变量Data中,调用失败返回Fasle,Out中数据无效!
OceanWave 2003-05-18
  • 打赏
  • 举报
回复
把COM 导入了,然后我这样调用读方法
procedure TfrmReadCard.btnWrCardClick(Sender: TObject);
var
MCard :OleVariant;
CustID: OleVariant;
iter: IRWCard;
begin
MCard:=iter.Read(CustID);
end;

发现CustID的地址总是为0
outer2000 2003-05-18
  • 打赏
  • 举报
回复
你直接把COM导入应该就可以了啊;?自动生成了接口声明

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧