2 loco 001 loco_001 于 2015.06.16 09:37 提问

【下跪】PB调用C的DLL报错

一下是文档中的结构体:

 typedef struct
{
byte  Track2[37]; /*二磁道信息 ,asc格式 最长37个字节 */
byte  Track3[104];  /*三磁道信息 ,  asc 格式  最长 104个字节*/
byte  Pwd[8]; /*加密后的密码  8个字节 */
byte  Amount[12];  /* 金额, 分为单位000000000001 代表1分,不允许0金额,积分兑奖时为积分*/
byte  Trace[6];     /* 终端流水,不是动态库的流水*/
byte  OtherData[60];   /* 第三方关联数据 ,不足60位后补空格  见说明1*/
byte  MerId[12];/*商户号*/
byte      TerminalId[15];/*终端号*/
byte  OrdTrace[6];/*原终端流水号,脱机批上送的时候为做脱机交易时调用 Bank_GetBankTrace取到的流水*/
byte  OrgRetRefNo[8]; /* 原交易检索参考号 */
byte  AccumulateCountAmount[108];   /* 仅结算交易有,格式见说明3*/
byte  PrmVersionInfo[12+1];     /*参数版本号 ,初始值为010101000000*/
byte  CAVersionInfo[8+1];     /* 公钥版本号.初始值01010100 */
}bank_input ;

以下是打包接口函数

 2.3查余额交易打包接口
/*--------------------------------------------------------------------------
FUNCTION NAME: Bank_ Balance
DESCRIPTION:   查余额交易
PARAMETERS:    
   BANK_Input * p_Input  终端传给交易模块的磁道等交易信息
byte * PacketData      打好的数据包 ,8583格式
int *Datalen           打包的数据长度
输入要素:
Track2
Track3
Pwd
Amount
Trace
MerId
TerminalId
InputMode
PinInFlag
Field55
Field55len
SeqNum
BatchNum
PaymentCode   //  (有卡自助交易)付款代码,格式:14位YYYYMMDDHHMMSS+15位银行终端号,其余位右补空格填满40字节 ,必须按格式送


RETURN:     
0   - success,    查余额请求包成功
-1   - fail        打包失败
NOTE:   
*-------------------------------------------------------------------------*/
 int Bank_Balance(BANK_Input * p_Input ,byte * PacketData , int *Datalen) ;

我的函数定义:
FUNCTION integer Bank_Balance( ref bank_input p_Input ,ref byte PacketData,ref long Datalen ) LIBRARY "ICBCTRansLib.dll" ALIAS FOR "Bank_Balance;Ansi"

bank_input做了一个结构体
图片说明

报错如下:
图片说明

几个疑问:
1、PB调用C的结构体直接传递PB的结构体就可以吗?
2、结构体定义中的定长byte类型,在PB中是否需要定义为byte数组?
3、结构体定义中有些类型为byte aaaa[12+1] 其中的【12+1】是什么意思?
4、究竟该如何调用这样的函数,苦求。

2个回答

gamefinity
gamefinity   Rxr 2015.06.16 12:35

1.直接传结构可以
2.可以穿byte的数组,等传回后,自己拼接字符串
3.12+1是C的常用写法。因为是字符串,有一个结尾符'\0',实际要存放的数据是12字节,但是为了保存结束符所以定义为13字节。PB中直接理解为13字节就可以了
4.如果没有Alias,可以不用写。但是你现在的写法:ALIAS FOR "Bank_Balance;Ansi"我没有试过。我的理解是alias是原函数的函数名,因此不应该有分号。为了区分Ansi、Unicode,Win32API里一般是写成MessageBoxA之类的,当然是它原来的函数名是如此。

loco_001
loco_001 感谢,但是我这么写PB报错参数错误。兄台可方便给个QQ帮在下看一下?十分感谢。
2 年多之前 回复
lzp_lrp
lzp_lrp   Ds   Rxr 2015.06.25 16:06

1、PB调用C的结构体直接传递PB的结构体就可以吗?
2、结构体定义中的定长byte类型,在PB中是否需要定义为byte数组?
3、结构体定义中有些类型为byte aaaa[12+1] 其中的【12+1】是什么意思?
4、究竟该如何调用这样的函数,苦求。

答:你定义的结构不对吧?上面的是13个属性,你在pb里声明了超过19个属性,肯定会提示不匹配,另外,如果byte参数不匹配的话,可以考虑用string或者char

Csdn user default icon
上传中...
上传图片
插入图片