0

Win CE 6.NET を使用するリーダーでパスポート情報 (MRZ) を読み取ろうとしています。ベンダーの API は C++ で記述されています

//[C + +]
typedef int (* CRXCALLBACK) (BYTE *pRecvBuff, nDataLen int);
int FAR PASCAL EXPORT CRX_Open (CRXCALLBACK lpDataCallback);

これは私のVB.NET実装です

'[VB.NET]
Public Class CRX
  Public Delegate Function CRXCALLBACK (ByVal pRecvBuff As System.IntPtr, ByVal nDataLen As   Integer) As Integer
  <DllImport("Mrz.dll", EntryPoint:="CRX_Open", SetLastError:=True)> _
  Public Shared Function CRX_Open(ByVal lpDataCallback As CRXCALLBACK) As Integer
  End Function
End Class

フォームで

Private Sub CRX_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 If CRX.CRX_Open(AddressOf MrzReaderCallback) <> CRX_ERR_SUCCESS Then
   MessageBox.Show("CRX_Open Failed")
 End Sub
Private Function MrzReaderCallback(ByVal pRecvBuff As System.IntPtr, ByVal nDataLen As Integer) As Integer
        Try
            Dim str As String = Marshal.PtrToStringUni(pRecvBuff)
            MsgBox(str)
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
        End Try
        Return CRX_ERR_SUCCESS

しかし、pRecvBuff使用してコンテンツを受け取ると、Marshal.PtrToStringUni (pRecvBuff, nDataLen)読めない文字が返されます

私への提案はありますか、何が間違っていますか?

よろしく

イヴァン

4

2 に答える 2

1

Marhsal.PtrToStringUni、バッファ ( IntPtr) に Unicode 文字列を構成するバイト配列が含まれていることを想定しています。

C++ API が Unicode を使用していない場合は、代わりにMarshal.PtrToStringAnsiorが必要になる場合があります。Marshal.PtrToStringBSTR

于 2013-06-20T16:55:20.730 に答える