大家好:
我現在有這樣一個問題,希望各位高手能賜教。
我有一個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)
請各位大蝦幫幫忙忙,看是什么原因引起的。
謝謝各位。
uj5u.com熱心網友回復:
1.如果dll可以調整的話,建議把結構調整字串或者字串陣列,這樣pb呼叫起來沒有問題2.如果dll不能調整,建議你用其它語言再封裝一個dll,通過pb傳遞字串來進行調整你的dll,你的dll再呼叫這個dll
3.或者采用pbni來實作
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/34759.html
標籤:控件與界面
上一篇:pb根據身份證號計算年齡生日
