通过客服给的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
其中
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
http://www.pinvoke.net/default.aspx/kernel32/MoveMemory.html
[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)
而是在于GetAllUserID_EXT()
在VB中这个方法的函数声明为
Public long GetAllUserID_EXT( long* pAllIDInfo );
这里返回的是一个数组首位的指针,这样在VB中UInfoArray数组就能够全部被赋值了。
但是在C#中 这个函数被声明为
public virtual int GetAllUserID_EXT(ref int pAllIDInfo)
这样只能取到数组首位的值,而无法取到全部的值。
由于本人才疏学浅,对指针这一部分不太了解,希望版主不吝赐教。
通过Marshal.Copy转换
1.OCX控件没有源代码,无法更改函数原型。
2.在OCX控件添加到C#中时,VS2010自动生成了接口包装的代码,我还没找到方法修改。