考勤机二次开发求助

hanablanche 2013-10-06 08:29:23
通过客服给的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#中应该如何转换?
...全文
414 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanablanche 2013-10-09
  • 打赏
  • 举报
回复
引用 5 楼 dongxinxi 的回复:
那就返回IntPtr 通过Marshal.Copy转换
无法返回IntPtr类型,因为 1.OCX控件没有源代码,无法更改函数原型。 2.在OCX控件添加到C#中时,VS2010自动生成了接口包装的代码,我还没找到方法修改。
men52676521 2013-10-09
  • 打赏
  • 举报
回复
试着下载一个代码转换软件吧!也许会有有所帮助
  • 打赏
  • 举报
回复
那就返回IntPtr 通过Marshal.Copy转换
hanablanche 2013-10-09
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.copy.aspx
感谢版主的回复,我查阅了很多资料发现问题不是在于CopyMemory() 而是在于GetAllUserID_EXT() 在VB中这个方法的函数声明为
Public long GetAllUserID_EXT( long* pAllIDInfo );
这里返回的是一个数组首位的指针,这样在VB中UInfoArray数组就能够全部被赋值了。 但是在C#中 这个函数被声明为
public virtual int GetAllUserID_EXT(ref int pAllIDInfo)
这样只能取到数组首位的值,而无法取到全部的值。 由于本人才疏学浅,对指针这一部分不太了解,希望版主不吝赐教。
wwwspider001 2013-10-07
  • 打赏
  • 举报
回复
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)
wwwspider001 2013-10-07
  • 打赏
  • 举报
回复
一对一转换 http://www.pinvoke.net/default.aspx/kernel32/MoveMemory.html
threenewbee 2013-10-06
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.copy.aspx

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧