PB调用DLL传结构体参数出错

xmq1022 2015-06-16 05:08:27
大家好:
我现在有这样一个问题,希望各位高手能赐教。
我有一个DLL,里面有一个接口函数是:

int Bank_Balance(BANK_Input * p_Input ,byte * PacketData , int *Datalen) ;
里面有一个结构体参数定义如下:
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 */
byte InputMode; /* 刷卡为0x31 ,fallback 为0x32, 插ic卡为0x33*/
byte PinInFlag; /* 是否输密,0x31为输入密码, 0x30 未输密*/
byte Field55[255]; /*IC卡55域信息 见说明6*/
byte Field55len; /*55域长度 */
byte SeqNum[2]; /*第一个字节:是否有卡序列号标志, 0x01 表示有0x00表示没有,第二个字节:实际卡序列号 */
byte OTranDate[8]; /* 原交易日期 YYYYMMDD*/
byte OTranTime[6]; /* 原交易时间 */
byte PreRetRefNo[15]; /* 检索参考号前缀,TC批上送,脚本通知需要,与检索参考号加起来是23位检索参考号*/
byte BatchNum[6]; /* 批次号 */
byte Pan[20]; /* 以0x00 结尾的卡号,TC 批上送,脚本通知要传*/
byte CtlsPrmVersionInfo[12+1]; /*非接参数版本号 ,初始值为010101000000*/
byte AuthID[6]; /*授权码 */
byte OrgTermId[15]; /* 原交易终端号,退货用*/
byte PaymentCode[40]; /* (有卡自助交易)付款代码,格式:14位YYYYMMDDHHMMSS+15位银行终端号,其余位右补空格填满40字节*/
byte JifenType; /* 积分类型 取值积分标志:0-综合贡献 1-特定活动1 2-特定活动2 3-特定活动3 4-特定活动4 5-特定活动5 6-特定活动6 -联名积分 ,类型为 ascii 如果为0则为0x30 */
byte OfflineFlag; /* 脱机交易标志 说明1:0x31为正常交易,0x30为已当日撤销交易 0x33 被撤销的固定金额,0x32 固定金额,0x34 扣钱且转联机 */
byte CupContactlessCard; /* 是否银联电子现金卡 ,取值0x0 或0x1
电子现金,非'4','5'打头的卡*/
byte ExpDate[4]; /* 有效期, 脱机交易批上送的时候送*/
byte ContactlessSupFlg; /* 是否支持非接,签到时传入 ,取值0x0 或0x1*/
byte CNPCFlag; /* 是否中油终端,默认不是,送1是中油终端取值0x0 或0x1*/
byte FCardFlag; /* 是否支持外卡 ,默认不支持,送1支持取值0x0 或0x1*/
byte Reverse[256]; /* 保留*/
}BANK_Input;

-----------------------------------------------------------
我用PB11.5来调用这个接口,我的声名如下:

FUNCTION long Bank_Balance (ref bank_input p_Input, ref byte PacketData[],ref long Datalen) LIBRARY "ICBCTRansLib.dll" alias for "Bank_Balance;Ansi"

在PB11中的对应结构体如下:
global type bank_input from structure
byte track2[37]
byte track3[104]
byte pwd[8]
byte amount[12]
byte trace[6]
byte otherdata[60]
byte merid[12]
byte terminalid[15]
byte ordtrace[6]
byte orgretrefno[8]
byte accumulatecountamount[108]
byte prmversioninfo[13]
byte caversioninfo[9]
byte inputmode
byte pininflag
byte field55[255]
byte field55len
byte seqnum[2]
byte otrandate[8]
byte otrantime[6]
byte preretrefno[15]
byte batchnum[6]
byte pan[20]
byte ctlsprmversioninfo[13]
byte authid[6]
byte orgtermid[15]
byte paymentcode[40]
byte jifentype[1]
byte offlineflag[1]
byte cupcontactlesscard
byte expdate[4]
byte contactlesssupflg
byte cnpcflag
byte fcardflag
byte reverse[256]
end type


可是在PB中调用到Bank_Balance 时就报如下的错误:

---------------------------
PowerBuilder Application Execution Error (R0042)
---------------------------
Application terminated.

Error: Specified argument type differs from required argument type at runtime in DLL function hsformat.
(invalid stack pointer on return from function call) at line 37 in clicked event of object cb_hk_format of w_examplecode_main.
---------------------------
确定
---------------------------
查遍了资料:
1.也有哥们发过帖子:
http://bbs.csdn.net/topics/200028452
说是DLL中的结构体和PB中的结构体类型不匹配
2.另一个帖子说他的错误,把dll
  int _stdcall rtunyeartest(AbsoluteTime stuAbsoluteTime)

改成这样搞定
int _stdcall rtunyeartest(AbsoluteTime* stuAbsoluteTime)

请各位大虾帮帮忙忙,看是什么原因引起的。

谢谢各位。
...全文
1681 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
WorldMobile 2015-06-17
  • 打赏
  • 举报
回复
1.如果dll可以调整的话,建议把结构调整字符串或者字符串数组,这样pb调用起来没有问题 2.如果dll不能调整,建议你用其它语言再封装一个dll,通过pb传递字符串来进行调整你的dll,你的dll再调用这个dll 3.或者采用pbni来实现

604

社区成员

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

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