0

私はあなたに私を助けるように頼むためにこの投稿を書きました. 私の要件は、c# コンテキストで scard32.dll を使用してスマート カード (sle4428) を読み書きすることです。リーダーは SCM Microsystem の SCR 3310 です。

まず第一に、正しく実行される vb.net コードがあり、データの読み取りと書き込みができます。問題は、c# を使用して同じことをしようとするときです。私の最初の試みは、C# でネイティブ呼び出し "SCardComand" を翻訳することでしたが、失敗しました。2 番目の試みは、VB.net コードから dll を構築し、それを ac# コンテキストで使用することでしたが、それでも失敗します。

そして、私がこの投稿を書いているのは、私がこれ以上アイデアを持っていないからです.

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 を取得できますが、これは私にとっては何の意味もありません。

誰かがどのように進むべきかについて考えを持っているなら、お願いします...

4

1 に答える 1

0

私が最初に気付くのは、あなたの 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 コードがハンドル、dataInLen、および dataOutLen に IntPtr を使用せず、明らかに IntPtr != integer を使用していないためです。16384 を取得する理由は、実際に正しい答えを得るために IntPtr を整数にマーシャリングする必要があるためです。

私の提案が機能しない場合は、このコマンドのドキュメントを投稿してください。代替案を提案するには、C/C++ コード内でプロトタイプがどのように宣言されているかを知る必要があります。

于 2011-02-11T13:49:28.700 に答える