有這樣一個dll: M1card.dll
dll里又有物件 CPIC(原型是M1card.CPIC)
procedure InitCard(const Key,Code: WideString; Sector, CtCode: Integer); safecall;
function ReadCardInfo(var DataFlag: Integer; var CardData: TCardData): Integer; safecall;
DataFlag:回傳錯誤代表
CardData:收費扇區資料
TCardData = record
Balance: Double; //卡金額(4位元組)
BtDate: WideString; //補貼標志(寫進卡片,補貼日期,防止重復領取 3位元組)用于讀取
Timer: WideString; //計時(5位元組) 用于讀取
LimitMoney1: WideString; //限額(3位元組) 不填或者填“000000”
LimitTimes1: Integer; //限次(1位元組)
OrderTime: WideString; //訂餐時間(2位元組) 用于讀取
OrderRecord: WideString; //訂餐記錄(4位元組) 用于讀取
UseTimes: Integer; //使用次數(3位元組)十進制
WriteFlag: Integer; //寫卡標志(1位元組) 用于讀取
end;
我在PB也宣告了一人structure是s_carddata,呼叫代碼如下:
long code,rtn,ctcode
string key,code
s_carddata carddata
OleObject obj
Obj = Create OleObject
Obj.ConnectToNewObject("M1card.CPIC")
Obj.InitCard(Key,Code,1,ctcode)//這行呼叫正常
rtn=obj.ReadCardInfo(code,carddata) //這行出錯呼叫出錯,錯誤代碼35
........
我也試過不用ole的方式,而是直接在local external functions宣告函式
function long ReadCardInfo (ref long flag,ref s_carddata carddata)library "M1card.dll"
這樣呼叫就提示錯誤代碼15
所以,初步判斷這個dll只能通過ole的方式呼叫。這一句obj.ReadCardInfo(code,carddata),可能是傳遞結構引數carddata出錯。
請教大家應該怎么處理?
uj5u.com熱心網友回復:
應該是結構里定義的型別出問題,在pb中不要用int,要用long或者
obj.ReadCardInfo(code, ref carddata)
uj5u.com熱心網友回復:
在PB中,結構的定義時,int已轉為long,double不變,widestring轉為stringobj.ReadCardInfo(code, ref carddata)
呼叫時,也試過加ref和不加ref,都是一樣錯誤
Obj.InitCard(Key,Code,1,ctcode)//這行呼叫正常
rtn=obj.ReadCardInfo(code,carddata) //這行出錯呼叫出錯
呼叫正常的這一行,引數沒有用到結構,呼叫就正常,下一行用到carddata的結構,呼叫就出錯
uj5u.com熱心網友回復:
那應該還是結構出的問題,WideString型別如果為pchar的話,兼容性比較好,如果為WideString或者string的話,兼容性比較差,別的語言呼叫容易出錯,建議把介面調整一下,如果他們不調整,建議你用delphi再封裝一個dll,然后再在pb中呼叫
uj5u.com熱心網友回復:
再用delphi封裝那就麻煩了。是這樣的,M1card.dll這個介面檔案,又分為CPIC、CPID等幾個類,CPIC下就是具體的函式了,比如說ReadCardInfo(para1,para2),在dll檔案里, TCardData這個結構不在CPIC和CPID下,而是直接在M1card.dll下,和CPIC是同級的,那如何讓PB可以參考得到M1card.dll的這個結構體呢。
我試過
OleObject objcard
Objcard = Create OleObject
Objcard.ConnectToNewObject("M1card.TCardData")
Obj.InitCard(Key,Code,1,ctcode)//這行呼叫正常
rtn=obj.ReadCardInfo(code,ref objcard)
還是參考不到。
uj5u.com熱心網友回復:
他們提供的VB的demo,沒有定義結構體,而是直接參考M1card.dll的結構體dim carddata as Tcarddata
然后就直接呼叫了
obj.ReadCardInfo(code,carddata)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/52529.html
標籤:基礎類
上一篇:pb呼叫word檔案列印
