Scard32.dll и аналогичные - PullRequest
       2

Scard32.dll и аналогичные

0 голосов
/ 11 февраля 2011

я написал этот пост за просьбу помочь мне. Мое требование - читать и писать на смарт-карту (sle4428), используя scard32.dll в контексте c #. Считыватель SCR 3310 SCM Microsystem

Прежде всего, у меня есть код vb.net, который корректно запускается, и я могу читать и записывать данные. Проблема в том, что я пытаюсь сделать то же самое с помощью C #. Моей первой попыткой было перевести собственный вызов "SCardComand" в c #, но не получилось. Вторая попытка состояла в том, чтобы собрать dll из кода VB.net и использовать его в контексте c #, но все равно не получилось.

И если я пишу этот пост, потому что у меня больше нет идей.

следуйте, я предоставляю вам родной вызов в VB.net

    <DllImport("SCARD32", EntryPoint:="SCardComand", SetLastError:=True, CallingConvention:=CallingConvention.Winapi, CharSet:=CharSet.Ansi, ExactSpelling:=True)> _
Public Shared Function SCardComand(ByRef handle As Integer, 
<MarshalAs(UnmanagedType.VBByRefStr)> ByRef cmd As String, 
ByRef cmdLen As Integer, 
<MarshalAs(UnmanagedType.VBByRefStr)> ByRef dataIn As String, 
ByRef dataInLen As Integer, 
<MarshalAs(UnmanagedType.VBByRefStr)> ByRef dataOut As String, 
ByRef dataOutLen As Integer) As Integer
End Function

и вот мой перевод на c #.

      [DllImport("SCARD32.DLL")]
  static extern UInt32 SCardComand(IntPtr handle,
  [MarshalAs(UnmanagedType.LPTStr)] ref String cmd,
  IntPtr cmdLen,
  [MarshalAs(UnmanagedType.LPTStr)] ref String dataIn,
  IntPtr dataInLen,
  [MarshalAs(UnmanagedType.LPTStr)] out String dataOut,
  IntPtr dataOutLen);

И для истины, если я выполню эту команду в c # int Ret = SCardComand(0, "Card,MemVerifyPin,FFFFF", 0,"",0, "", 0); Получить 16384, что для меня ничего не значит.

Пожалуйста, если у кого-то есть представление о том, как действовать ...

1 Ответ

0 голосов
/ 11 февраля 2011

Первое, что я заметил, это то, что ваш C # неверен

[DllImport("SCARD32.DLL")]    static extern UInt32 SCardComand(IntPtr handle,    [MarshalAs(UnmanagedType.LPTStr)] ref String cmd,    IntPtr cmdLen,    [MarshalAs(UnmanagedType.LPTStr)] ref String dataIn,    IntPtr dataInLen,    [MarshalAs(UnmanagedType.LPTStr)] out String dataOut,    IntPtr dataOutLen);  

должно быть:

[DllImport("SCARD32.DLL")]    static extern UInt32 SCardComand(int handle,    [MarshalAs(UnmanagedType.LPTStr)] ref String cmd,    IntPtr cmdLen,    [MarshalAs(UnmanagedType.LPTStr)] ref String dataIn,    int dataInLen,    [MarshalAs(UnmanagedType.LPTStr)] out String dataOut,    int dataOutLen);  

Причина этого в том, что рабочий код VB.net не использует IntPtrдля дескриптора dataInLen и dataOutLen и, очевидно, IntPtr! = integer.Причина, по которой вы получаете 16384, состоит в том, что вам нужно было бы преобразовать в IntPtr целое число, чтобы на самом деле получить правильный ответ.

Если мое предложение не работает, то опубликуйте документацию по этой команде, нужно знатькак прототип объявляется в коде C / C ++, чтобы предложить более вероятную альтернативу.

...