pb如何调用参数16进制的函数

lzj033 2011-07-13 07:20:06
外部函数的原型是这样的
int DF_AuthPro(int hReader,stDFAuth pDFAuth);
其中pDFAuth结构体定义:
typedef struct{
BYTE DFAID[3];
BYTE KeyNo;
BYTE PsamKeyType;
BYTE PsamKeyIndex;
BYTE PsamAPP;
}

在c#的例程里这样调用的
stDFAuth stDFAuth = new stDFAuth();
stDFAuth.DFAID = new byte[] { 0x01, 0x00, 0x00 };
stDFAuth.KeyNo = 0x01;
stDFAuth.PsamAPP = 0x11;
stDFAuth.PsamKeyIndex = 0x01;
stDFAuth.PsamKeyType = 0x01;

ReadCard.DF_AuthPro(hReader, stDFAuth);

pb里该怎样调用呢?
...全文
453 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wag_enu 2011-07-14
  • 打赏
  • 举报
回复
Alias 后还有一个 for ,
呵呵。。。
wag_enu 2011-07-14
  • 打赏
  • 举报
回复
PB用的什么版本?
PB10 以上试一下:
function integer DF_AuthPro(integer hReader,stDFAuth pDFAuth) library "xxx.DLL" Alias "DF_AuthPro;ansi"

然后PB的数据类型也有byte.

lzj033 2011-07-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yyoinge 的回复:]
stdfauth是一个结构体,你要先定义结构体,结构体中的byte类型用int来代替,赋值时将16进制的转换为10进制的,如0x01,转换为1
又如stdfauth.dfaid = {1,0,0}
[/Quote]
我知道stdfauth是结构体,结构体中的byte类型用int来代替,传入函数时报错,说类型不一致,用long,char型代替也是报错。
结构体我是如下定义的

global type stdfauth from structure
character dfaid[3]
character keyno
character psamkeytype
character psamkeyindex
character psamapp
end type

传入前赋值如下
istr_stdfauth.DFAID[1] = string(asc('01'))
istr_stdfauth.DFAID[2] = string(asc('00'))
istr_stdfauth.DFAID[3] = string(asc('00'))
istr_stdfauth.KeyNo = string(asc('01'))
istr_stdfauth.PsamAPP = string(asc('11'))
istr_stdfauth.PsamKeyIndex = string(asc('01'))
istr_stdfauth.PsamKeyType = string(asc('01'))

调用
ll_rtn = DF_AuthPro(il_handle, istr_stdfauth)
报错:
Error: Specified argument type differs from required argument type at runtime in Dll function df_authpro.(invalid stack pointer on return from function call) at line 33 in function of_drrz of object invo_proxy.

结构体用int定义也试过
global type stdfauth from structure
integer dfaid[3]
integer keyno
integer psamkeytype
integer psamkeyindex
integer psamapp
end type

传入前赋值如下
istr_stdfauth.DFAID[1] = 1
istr_stdfauth.DFAID[2] = 0
istr_stdfauth.DFAID[3] = 0
istr_stdfauth.KeyNo = 1
istr_stdfauth.PsamAPP = 17
istr_stdfauth.PsamKeyIndex = 1
istr_stdfauth.PsamKeyType = 1

调用
ll_rtn = DF_AuthPro(il_handle, istr_stdfauth)

还是报一样的错。

另外,厂家给的函数说明如下:
功能说明 完成对Desfire卡读、写、扣款等操作前的认证
入口参数 hReader:操作句柄。为LinkReaderPro的返回值
BlockNo: 块号
Inbuf: 输入ASCII码串,以0x00结束. 含0x00长度为7*2+1=15字节
由以下结构以1字节hex转成2字节ASCII字符,附加0x00.
typedef struct{
BYTE DFAID[3];//Desfire aid
BYTE KeyNo;//DesfireKeyNo
BYTE PsamKeyType;//psam Key用途
BYTE PsamKeyIndex;//psam Key索引
BYTE PsamAPP;//psam 应用类型
}stDFAuth

出口参数 0:成功
其他:错误代码
lzj033 2011-07-14
  • 打赏
  • 举报
回复
请高手帮忙啊。
lzj033 2011-07-14
  • 打赏
  • 举报
回复
pb8,不可能为了这个程序升级整个系统,我查了资料pb里使用char对应byte的,。。
yyoinge 2011-07-13
  • 打赏
  • 举报
回复
stdfauth是一个结构体,你要先定义结构体,结构体中的byte类型用int来代替,赋值时将16进制的转换为10进制的,如0x01,转换为1
又如stdfauth.dfaid = {1,0,0}
lzj033 2011-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xuam 的回复:]
声明:
function integer DF_AuthPro(integer hReader,stDFAuth pDFAuth) library "xxx.DLL"

调用跟C#一样.
[/Quote]

stDFAuth如何定义,我用的char型,long型,都报错,说参数类型不对。
xiaobn_cn 2011-07-13
  • 打赏
  • 举报
回复
请楼主理解一点,数值是10进制还是16进制对于计算机来说没有意义的,计算机只有2进制一种位权,所谓的10进制和16进制是为了符合我们人类的自然习惯才在计算机里出现的。所以下面两种种赋值方式对于计算机来说是等价的,没有任何区别:
Int a = 0x11;
Int a = 17;
所以调用函数时,参数里的值你用16进制赋值和10进制赋值没有区别,只要这两个数是相等的就可以了。
xuam 2011-07-13
  • 打赏
  • 举报
回复
声明:
function integer DF_AuthPro(integer hReader,stDFAuth pDFAuth) library "xxx.DLL"

调用跟C#一样.

680

社区成员

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

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