loco_001 2015-06-16 01:37 采纳率: 50%
浏览 3508

【下跪】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条回答

  • 知常曰明 2015-06-16 04: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之类的,当然是它原来的函数名是如此。

    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB动图的问题
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名