通过客服给的SDK包中的VB版本的sample要变为C#版本的
其中
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
 Public Const USER_BRIEFINFO_SIZE As Long = 24
 Dim UInfoArray(USER_BRIEFINFO_SIZE / 4 - 1) As Long
 
     Private Sub cmdGetEnrollInfo_Click()
    Dim nRet As Long
    Dim i As Long, j As Long, k As Long
    Dim szTemp As String, szTemp1 As String
    Dim UInfoOne As USERINFO_FLAG_TYPE    lstEnrollInfo.Clear
    
    nRet = frmMain.SB_APC1.ReadAllUserID_EXT()    lblMessage = pubGetErrorString    If nRet >= 0 Then
        lstEnrollInfo.AddItem ("No.    ID        Priv  Ena (FP1      ~       ~       ~      FP10)   PW  CD  GT  GV")
        i = 0
        While frmMain.SB_APC1.GetAllUserID_EXT(UInfoArray(0)) > 0
            i = i + 1
            CopyMemory UInfoOne, UInfoArray(0), USER_BRIEFINFO_SIZE            szTemp = Format(i, "000#") & "  " & Format(UInfoOne.dwID, "0000#") & "    "
            
            Select Case UInfoOne.byMgr         ' privilege
            Case 1
                szTemp1 = " U"
            Case 6
                szTemp1 = " M"
            Case 7
                szTemp1 = "SM"
            Case Else
                szTemp1 = "_"
            End Select
            szTemp = szTemp & szTemp1 & "   "
            
            If UInfoOne.bEnable = 0 Then       ' enable
                szTemp1 = "0"
            Else
                szTemp1 = "1"
            End If
            szTemp = szTemp & szTemp1 & "    "
            
            szTemp1 = ""
            k = UInfoOne.dwUsedFlag
            For j = 0 To 9                          ' FP flag
                If (k \ 2) Mod 2 = 1 Then
                    szTemp1 = szTemp1 & "1"
                Else
                    szTemp1 = szTemp1 & "0"
                End If
                If k Mod 2 = 1 Then
                    szTemp1 = szTemp1 & "1."
                Else
                    szTemp1 = szTemp1 & "0."
                End If
                k = k \ 4
            Next j
            szTemp = szTemp & szTemp1 & "    "
            
            szTemp1 = ""
            If (k \ 2) Mod 2 = 1 Then               ' Password flag
                szTemp1 = "1"
            Else
                szTemp1 = "0"
            End If
            If k Mod 2 = 1 Then
                szTemp1 = szTemp1 & "1"
            Else
                szTemp1 = szTemp1 & "0"
            End If
            szTemp = szTemp & szTemp1 & "    "
            
            szTemp1 = ""
            k = k \ 4
            If (k \ 2) Mod 2 = 1 Then               ' Card flag
                szTemp1 = "1"
            Else
                szTemp1 = "0"
            End If
            If k Mod 2 = 1 Then
                szTemp1 = szTemp1 & "1"
            Else
                szTemp1 = szTemp1 & "0"
            End If
            szTemp = szTemp & szTemp1 & "    "
             
            If UInfoOne.byUseGroupTZ = 0 Then       ' Use Group Time Zone
                szTemp1 = "0"
            Else
                szTemp1 = "1"
            End If
            szTemp = szTemp & szTemp1 & "    "
            
            If UInfoOne.byUseGroupVM = 0 Then       ' Use Group Verify Mode
                szTemp1 = "0"
            Else
                szTemp1 = "1"
            End If
            szTemp = szTemp & szTemp1
            lstEnrollInfo.AddItem (szTemp)
        Wend
    End If
    
End Sub
上述语句当中的 函数CopyMemory 在C#中应该如何转换?考勤机C#VB

解决方案 »

  1.   

    http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.copy.aspx
      

  2.   

    一对一转换
    http://www.pinvoke.net/default.aspx/kernel32/MoveMemory.html
      

  3.   

    C# Signature:
    [DllImport("Kernel32.dll", EntryPoint="RtlMoveMemory", SetLastError=false)]
    static extern void MoveMemory(IntPtr dest, IntPtr src, int size);VB Signature:
    Declare Auto Sub MoveMemory Lib "Kernel32.dll" _
        Alias "RtlMoveMemory" (ByVal dest As IntPtr, ByVal src As IntPtr, ByVal size As Integer) 
      

  4.   

    感谢版主的回复,我查阅了很多资料发现问题不是在于CopyMemory()
    而是在于GetAllUserID_EXT()
    在VB中这个方法的函数声明为
    Public long GetAllUserID_EXT( long* pAllIDInfo );
    这里返回的是一个数组首位的指针,这样在VB中UInfoArray数组就能够全部被赋值了。
    但是在C#中 这个函数被声明为
    public virtual int GetAllUserID_EXT(ref int pAllIDInfo)
    这样只能取到数组首位的值,而无法取到全部的值。
    由于本人才疏学浅,对指针这一部分不太了解,希望版主不吝赐教。
      

  5.   

    那就返回IntPtr
    通过Marshal.Copy转换
      

  6.   

    无法返回IntPtr类型,因为
    1.OCX控件没有源代码,无法更改函数原型。
    2.在OCX控件添加到C#中时,VS2010自动生成了接口包装的代码,我还没找到方法修改。