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.