外部函式的原型是這樣的
int DF_AuthPro(int hReader,stDFAuth pDFAuth);
其中pDFAuth結構體定義:
typedef struct{
BYTE DFAID[3];
BYTE KeyNo;
BYTE PsamKeyType;
BYTE PsamKeyIndex;
BYTE PsamAPP;
}
在c#的例程里這樣呼叫的
stDFAuth stDFAuth = new stDFAuth();
stDFAuth.DFAID = new byte[] { 0x01, 0x00, 0x00 };
stDFAuth.KeyNo = 0x01;
stDFAuth.PsamAPP = 0x11;
stDFAuth.PsamKeyIndex = 0x01;
stDFAuth.PsamKeyType = 0x01;
ReadCard.DF_AuthPro(hReader, stDFAuth);
pb里該怎樣呼叫呢?
uj5u.com熱心網友回復:
宣告:function integer DF_AuthPro(integer hReader,stDFAuth pDFAuth) library "xxx.DLL"
呼叫跟C#一樣.
uj5u.com熱心網友回復:
請樓主理解一點,數值是10進制還是16進制對于計算機來說沒有意義的,計算機只有2進制一種位權,所謂的10進制和16進制是為了符合我們人類的自然習慣才在計算機里出現的。所以下面兩種種賦值方式對于計算機來說是等價的,沒有任何區別:Int a = 0x11;
Int a = 17;
所以呼叫函式時,引數里的值你用16進制賦值和10進制賦值沒有區別,只要這兩個數是相等的就可以了。
uj5u.com熱心網友回復:
stDFAuth如何定義,我用的char型,long型,都報錯,說引數型別不對。
uj5u.com熱心網友回復:
stdfauth是一個結構體,你要先定義結構體,結構體中的byte型別用int來代替,賦值時將16進制的轉換為10進制的,如0x01,轉換為1又如stdfauth.dfaid = {1,0,0}
uj5u.com熱心網友回復:
我知道stdfauth是結構體,結構體中的byte型別用int來代替,傳入函式時報錯,說型別不一致,用long,char型代替也是報錯。
結構體我是如下定義的
global type stdfauth from structure
character dfaid[3]
character keyno
character psamkeytype
character psamkeyindex
character psamapp
end type
傳入前賦值如下
istr_stdfauth.DFAID[1] = string(asc('01'))
istr_stdfauth.DFAID[2] = string(asc('00'))
istr_stdfauth.DFAID[3] = string(asc('00'))
istr_stdfauth.KeyNo = string(asc('01'))
istr_stdfauth.PsamAPP = string(asc('11'))
istr_stdfauth.PsamKeyIndex = string(asc('01'))
istr_stdfauth.PsamKeyType = string(asc('01'))
呼叫
ll_rtn = DF_AuthPro(il_handle, istr_stdfauth)
報錯:
Error: Specified argument type differs from required argument type at runtime in Dll function df_authpro.(invalid stack pointer on return from function call) at line 33 in function of_drrz of object invo_proxy.
結構體用int定義也試過
global type stdfauth from structure
integer dfaid[3]
integer keyno
integer psamkeytype
integer psamkeyindex
integer psamapp
end type
傳入前賦值如下
istr_stdfauth.DFAID[1] = 1
istr_stdfauth.DFAID[2] = 0
istr_stdfauth.DFAID[3] = 0
istr_stdfauth.KeyNo = 1
istr_stdfauth.PsamAPP = 17
istr_stdfauth.PsamKeyIndex = 1
istr_stdfauth.PsamKeyType = 1
呼叫
ll_rtn = DF_AuthPro(il_handle, istr_stdfauth)
還是報一樣的錯。
另外,廠家給的函式說明如下:
功能說明 完成對Desfire卡讀、寫、扣款等操作前的認證
入口引數 hReader:操作句柄。為LinkReaderPro的回傳值
BlockNo: 塊號
Inbuf: 輸入ASCII碼串,以0x00結束. 含0x00長度為7*2+1=15位元組
由以下結構以1位元組hex轉成2位元組ASCII字符,附加0x00.
typedef struct{
BYTE DFAID[3];//Desfire aid
BYTE KeyNo;//DesfireKeyNo
BYTE PsamKeyType;//psam Key用途
BYTE PsamKeyIndex;//psam Key索引
BYTE PsamAPP;//psam 應用型別
}stDFAuth
出口引數 0:成功
其他:錯誤代碼
uj5u.com熱心網友回復:
PB用的什么版本?PB10 以上試一下:
function integer DF_AuthPro(integer hReader,stDFAuth pDFAuth) library "xxx.DLL" Alias "DF_AuthPro;ansi"
然后PB的資料型別也有byte.
uj5u.com熱心網友回復:
Alias 后還有一個 for ,呵呵。。。
uj5u.com熱心網友回復:
pb8,不可能為了這個程式升級整個系統,我查了資料pb里使用char對應byte的,。。uj5u.com熱心網友回復:
請高手幫忙啊。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/78050.html
標籤:API 調用
