调用dll问题

ljking0731 2011-10-18 10:03:46

procedure TForm1.Button3Click(Sender: TObject);
var
pWarnmsg, pErrmsg: array [0..1023] of char;
pDeptKey: array [0..511] of char;
pIssuedeptid: array [0..23] of char;
pIssuedate, pBirthDate: array [0..7] of char;
pIdtype, pCardType: array [0..1] of char;
pCardNo, pID, pTelephone: array [0..19] of char;
pName: array [0..11] of char;
pSex: array [0..0] of char;
pCompany: array [0..69] of char;
pAddress: array [0..79] of char;
Res: Integer;
begin
ZeroMemory(@pIssuedeptid, 24);
ZeroMemory(@pIssuedate, 8);
ZeroMemory(@pDeptKey, 512); //8
ZeroMemory(@pWarnmsg, 1024);
ZeroMemory(@pErrmsg, 1024);
ZeroMemory(@pCardType, 2);
ZeroMemory(@pIdtype, 2);
ZeroMemory(@pID, 20);
ZeroMemory(@pCardNo, 20);
ZeroMemory(@pName, 12);
ZeroMemory(@pSex, 1);
ZeroMemory(@pBirthDate, 8);
ZeroMemory(@pCompany, 70);
ZeroMemory(@pAddress, 80);
ZeroMemory(@pTelephone, 20);

Res := ykt_readopencardinfo_local('3500', '0101', pDeptKey, pIssuedeptid, pIssuedate,
pCardType, pCardNo, pIdType, pID, pName, pSex, pBirthDate, pCompany, pAddress,
pTelephone, pWarnmsg, pErrmsg);
if Res = 0 then
begin
Memo1.Lines.Append('pIssuedeptid: ' + String(pIssuedeptid));
Memo1.Lines.Append('pIssuedate: '+pIssuedate);
Memo1.Lines.Append('pCardType: '+pCardType);
Memo1.Lines.Append('pCardNo:'+pCardNo);
Memo1.Lines.Append('pIdtype:'+pIdtype);
Memo1.Lines.Append('pID:'+pID);
Memo1.Lines.Append('pName:'+pName);
Memo1.Lines.Append('pSex:'+pSex);
Memo1.Lines.Append('pBirthDate:'+pBirthDate);
Memo1.Lines.Append('pCompany:'+pCompany);
Memo1.Lines.Append('pAddress:'+pAddress);
Memo1.Lines.Append('pTelephone:'+pTelephone);
end else
begin
Memo1.Lines.Append(pWarnmsg);
Memo1.Lines.Append(pErrmsg);
end;

end;


按照文档,正确传入参数,最终也都有结果回来。但是该函数执行完后会报错(读地址错误),请问是啥原因
...全文
122 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzwcn 2011-10-18
  • 打赏
  • 举报
回复
调用接口,特别是C++写的DLL要非常注意调用约定。看文档或头文件看是stdcall还是cdecl等,不然自己一个一个试
ljking0731 2011-10-18
  • 打赏
  • 举报
回复
我把所有的参数都定义成:array [0..1023] of char,就都可以了。
估计是数组大小的问题。但是按照文档的定义,怎么会错呢。
ljking0731 2011-10-18
  • 打赏
  • 举报
回复

3. 脱机读取卡信息
函数声明 int ykt_readopencardinfo_local (char *pRegion, char *pDeptid,char *pDeptKey, char *pIssuedeptid,char *pIssuedate, char *pCardtype,char *pCardno,char *pIdtype,char *pId,char *pName, char *pSex,char *pBirthDate,char *pCompany,char *pAddress,char *pTelephone, char *pWarnmsg,char *pErrmsg)
用途说明 用于脱机读取当前卡具内的卡片卡号和卡类型,用于安全性要求不高的场合。
参数说明 名称 类型长度 说明 备 注
pRegion Char(4) 地区编号 3500代表省本级
pDeptID Char(4) 网点编号 医院在医保中心的编号
pDeptKey Char(512) 网点密钥 暂不使用,医院系统改造时应为可设置参数
pIssuedeptid Char(24) 发卡机构编号
pIssuedate Char(8) 发卡日期
pCardtype Char(2) 卡类型 返回2表示社会保障卡
pCardno Char(20) 卡号 可包含字母或数字
pIdtype Char(2) 证件类型 01代表身份证
pId Char(20) 身份证号 15或18位
pName Char(12) 姓名
pSex Char(1) 性别 1男 2女 3 未定义
pBirthDate Char(8) 出生日期
pCompany Char(70) 单位名称
pAddress Char(80) 通讯地址
pTelephone Char(20) 联系电话
pWarnmsg Char(1024) 警告信息
pErrmsg Char(1024) 错误信息
返回值
0 成功
<>0 错误,详见pErrmsg

Elvis_chen 2011-10-18
  • 打赏
  • 举报
回复
你是否有提前释放地址呢
浩南_哥 2011-10-18
  • 打赏
  • 举报
回复
把你的函数原型贴出来,可能是你的参数传递问题
bdmh 2011-10-18
  • 打赏
  • 举报
回复
原型呢

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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