日曜日, 5月 20, 2007

SCardTransmitについてのメモ

C# から、winscard.dllを呼び出して使う場合に、SCardTransmitが上手くいかなかった時のメモ。

最終的に次のようにしたら上手くいった。

[DllImport("WinScard.dll")]
public static extern int SCardTransmit(uint hCard, ref SCARD_IO_REQUEST pioSendPci, byte[] pbSendBuffer, int cbSendLength, ref SCARD_IO_REQUEST pioRecvPci, ref byte pbRecvBuffer, ref int pcbRecvLength);

Webをさがしてると、最初の"SCARD_IO_REQUEST"をOSの機能を利用して情報をとってくる処理をしているのがあり、それでもいけるのだとは思う。

[StructLayout(LayoutKind.Sequential)]
internal struct SCARD_IO_REQUEST
{
internal uint dwProtocol;
internal uint cbPciLength;
}

実際に、
 dwProtocol は、T0の値を、cbPciLengthは8を代入。

int ResultTrans = SCardTransmit(this.phCard, ref SendPci, pbSendBuffer, cbSendLength,ref ioReq, ref pbRecvBuffer[0], ref pcbRecvLength);

 pbRecvBuffe[0] に着目。 ここでつまっていました。 この[0]がないとだめ。 実際には、リターンコードが0で成功しているのにもかかわらず、受信バッファがとれない。上記のDLLImportでbyte[]に変更してもだめ。 もともとネイティブではポインタで、マーシャリングの関係なのだと考えている。 いっそのことIntPtrで処理しようかと試したのだけれども、IntPtrからByteに変更するところでエラー。 たんに、やり方しらないだけかもしれないのだけども、とっとと動く方を採用して使う。

fin.