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.PtrToStringAnsiMarshal.PtrToStringBSTR代替。

于 2013-06-20T16:55:20.730 回答
0

你好我用这段代码解决

 Private Function MrzReaderCallback(ByVal pRecvBuff As System.IntPtr, ByVal nDataLen As Integer) As Integer
        Dim b As Byte
        Dim c As Char
        Dim s As String = ""
        Try
            For x As Integer = 8 To nDataLen
                b = Marshal.ReadByte(pRecvBuff, x)
                If b = &H0 Or b = &H1 Or b = &H2 Or b = &H3 Or b = &H60 Then
                    b = &H20
                ElseIf b <> &HD Then
                    c = Convert.ToChar(b)
                    s &= c.ToString
                End If
            Next
            SetText(s, txtMRZ)
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error ex")
        End Try
        Return mi3api.MachineReadableDataProcessingAPI.CRX_ERR_SUCCESS
    End Function
于 2013-07-10T18:55:05.047 回答