2009-05-19 60 views
0

我想在Delphi下使用API​​。這裏是API文檔如何使用PUCHAR調用API?

OKERR ENTRY SCardCLMifareStdAuthent 
    (IN SCARDHANDLE ulHandleCard,IN ULONG ulMifareBlockNr, 
    IN UCHAR ucMifareAuthMode,IN UCHAR ucMifareAccessType,IN UCHAR ucMifareKeyNr, 
    IN PUCHAR pucMifareKey,IN ULONG ulMifareKeyLen); 

鑑於pucMifareKey:A pointer to the six byte Mifare key。 迄今我一直在嘗試的代碼;

function Auth():Integer; 
type 
    TSCardCLMifareStdAuthent = function(SCARDHANDLE: cardinal; ulMifareBlockNr: ULONG; 
    ucMifareAuthMode, ucMifareAccessType, ucMifareKeyNr: byte; pucMifareKey: puchar; 
    ulMifareKeyLen: cardinal):LONG; 
var 
    SCardCLMifareStdAuthent: TSCardCLMifareStdAuthent; 
    hDLL: Integer; 
    CardHandle: cardinal; 
    i: integer; 
    Key: array of UCHAR; 
begin 
    Result:=1; 
    //CardHandle is defined here 
    SetLength(Key, 6); 
    for i := low(key) to high(key) do 
    Key[i] := $FF; 
    hDLL := LoadLibrary('scardsyn.dll'); 
    @SCardCLMifareStdAuthent := GetProcAddress(hDLL, 'SCardCLMifareStdAuthent'); 
    if @SCardCLMifareStdAuthent <> nil then 
    Result:=SCardCLMifareStdAuthent(CardHandle, $00, 96, 0, 0, ^Key, 6); 
    FreeLibrary(hDLL); 
end; 

我得到的錯誤是在Incompatible types: 'Byte' and 'Char'由於Result:=SCardCL....上調鍵指針線。有任何想法嗎?

+0

您不會在帶有「^」字符的代碼中創建指針。這是DE引用已經是指針的東西,然後它出現在標識符的右邊。當它出現在左邊時,它需要在一個TYPE名稱之前,並且需要在一個類型或變量DECLARATION中出現,如何在一個可執行語句中。 – 2009-05-19 12:37:58

回答

1

我不知道有問題的DLL,但對於德爾福2009年前我將執行以下操作:

function Auth: integer; 
type 
    TSCardCLMifareStdAuthent = function(SCARDHANDLE: cardinal; 
    ulMifareBlockNr: ULONG; ucMifareAuthMode, ucMifareAccessType, 
    ucMifareKeyNr: byte; pucMifareKey: PAnsiChar; 
    ulMifareKeyLen: Cardinal): longint; 
var 
    SCardCLMifareStdAuthent: TSCardCLMifareStdAuthent; 
    hDLL: Integer; 
    CardHandle: Cardinal; 
    Key: string; 
begin 
    Result := 1; 
    //CardHandle is defined here... 
    Key := StringOfChar(Chr($FF), 6); 
    hDLL := LoadLibrary('scardsyn.dll'); 
    if hDLL <> 0 then begin 
    @SCardCLMifareStdAuthent := GetProcAddress(hDLL, 'SCardCLMifareStdAuthent'); 
    if @SCardCLMifareStdAuthent <> nil then begin 
     Result := SCardCLMifareStdAuthent(CardHandle, $00, 96, 0, 0, 
     PChar(Key), Length(Key)); 
    end; 
    FreeLibrary(hDLL); 
    end; 
end; 

您得到的訪問衝突可能來自C字符串不是以0結尾。使用一個字符串並將其轉換到PChar將使事情變得更容易。

1

你不會碰巧在Delphi 2009中?如果是這樣,「char」被定義爲2個字節。嘗試使用「AnsiChar」。

+0

不,我現在正在使用Delphi 7。 – 2009-05-19 11:53:20

2
type 
    TSCardCLMifareStdAuthent = function(SCARDHANDLE: cardinal; ulMifareBlockNr: ULONG; 
    ucMifareAuthMode, ucMifareAccessType, ucMifareKeyNr: byte; pucMifareKey: puchar; 
    ulMifareKeyLen: cardinal):LONG; 

我想你應該有「UCHAR」取代「字節」:

ucMifareAuthMode, ucMifareAccessType, ucMifareKeyNr: byte; 

這是一個不好的做法,把「字節」作爲「字符」。

+0

感謝您的建議,該部分現在已修復。但是我仍然在指針變量上出錯。 – 2009-05-19 12:07:17

+0

只要這是在Delphi 2009之前,使用char或byte就沒有區別。 – mghie 2009-05-19 12:36:06

1

嘗試這種情況:

  1. 介紹爲UCHAR的陣列新類型。
  2. 引入指針類型的新局部變量。
  3. 將這個變量設置爲指向您的鍵部分
  4. 使用該指針在函數調用

    type 
        TArrayOfUchar = array of UCHAR; 
    
    var 
        ... 
        Key : TArrayOfUchar; 
        PKey : ^TArrayOfUchar; 
    begin 
        ... 
        PKey = @Key; 
        if @SCardCLMifareStdAuthent <> nil then 
        Result:=SCardCLMifareStdAuthent(CardHandle, $00, 96, 0, 0, PKey, 6); 
    
+0

它在`Pkey:=^Key;`行給出`不兼容的類型:char和pointer`錯誤。 – 2009-05-19 12:39:55

1

您聲明密鑰是一個6字節(uchar)數組。你正在聲明一個動態數組傳遞,爲什麼不只是聲明一個數組?

var 
    {...} 
    MyKey: array[0..5] of UCHAR; 
begin 
    {...} 
    Result:=SCardCLMifareStdAuthent(CardHandle, $00, 96, 0, 0, @MyKey, 6);