2009-05-19 10 views
0

私はDelphiでAPIを使用しようとしています。 A pointer to the six byte Mifare key:ここpucMifareKey一方、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); 

です。 私がこれまで試みてきたコード。

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; 

私は取得していますエラーがResult:=SCardCL....キー^によるポインタのラインでIncompatible types: 'Byte' and 'Char'です。何か案は?

+0

"^"文字でコード内にポインタを作成しないでください。これはすでにポインタであるものをDE参照するためのもので、識別子の右に表示されます。左側に表示されている場合は、TYPE名の前に入力する必要があります。この名前は、タイプまたは変数DECLARATIONに表示する必要があります。 –

答えて

1

関数呼び出しのthisポインタのポインタであることを、この変数を設定しますが、デルファイのための2009 Iを事前次のようになります。

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にキャストすると、簡単になります。

+0

ありがとうございます。新しい関数はもっとうまくいくように思えますが、今は 'application defined exception'を出しています - これはCardHandleのDLLに起因すると思います。私は後で結果をテストして掲載します。 –

+0

私はまだ呼び出し規約を逃していると思います。おそらく "stdcall;"を追加します。関数の宣言に役立ちますか?それは最も可能性が高いですが、 "cdecl;"また可能です。 APIのドキュメントで詳細を確認する必要があります。 – mghie

+0

APIのドキュメントでは、キーが文字列または8ビット整数のシーケンスのようなものかどうかを伝える必要があります。前者を前提としていましたが、後者が本当の場合はPCharが正しくないので、代わりにその代わりにカスタム型を宣言し、pucMifareKeyをその型へのポインタにします。 – mghie

1

あなたはデルファイ2009にいないでしょうか?その場合、「char」は2バイトとして定義されます。代わりに "AnsiChar"を試してください。

+0

いいえ、私は現在Delphi 7を使用しています。 –

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

私はあなたが「UCHAR」で「バイト」を置き換えるべきだと思う:

ucMifareAuthMode, ucMifareAccessType, ucMifareKeyNr: byte; 

「文字」と「バイト」を治療する悪い習慣です。

+0

アドバイスをいただき、ありがとうございました。しかし、私はまだポインタ変数にエラーを取得しています。 –

+0

Delphi 2009より前のバージョンであれば、charまたはbyteの使用に違いはありません。 – mghie

1

はこれを試してみてください:

  1. はUCHARの配列のための新しいタイプを紹介します。
  2. ポインタ型の新しいローカル変数を導入しました。
  3. は、あなたのキー配列に
  4. 使用私は問題のDLLを知らない

    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'エラーがあります。 –

+0

申し訳ありません。あなたはどちらも正しいです。コードはテストされておらず、いくつかの愚かな間違いがありました。編集されたバージョンが正しいと思います(希望)。 – zendar

1

キーは6バイト(uchar)の配列であると述べました。動的配列を渡すことを宣言していますが、単に配列を宣言するだけではないのですか?

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