В ходе изучения VB.Net возник вопрос: как на VB.Net скопировать одну структуру в другую? Вот пример: Тем, кто переведет данный пример на VB.NET буду очень благодарен. '========begin============ 'VB (Classic) code :) Private Declare Sub CopyMemoryLpToLp Lib "kernel32" Alias "RtlMoveMemory" (ByVal pvDest As Long, ByVal pvSrc As Long, ByVal Length As Long) Private Type MyType1 iInt1 As Long iInt2 As Long End Type Private Type MyType2 iBt(3) As Byte iInt2 As Long End Type Private Sub Form_Load() Dim T1 As MyType1, T2 As MyType2 T1.iInt1 = &H31323334 T1.iInt2 = 1 CopyMemoryLpToLp VarPtr(T2), VarPtr(T1), Len(T1) Debug.Print Hex(T2.iBt(0)), Hex(T2.iBt(1)), Hex(T2.iBt(2)), Hex(T2.iBt(3)), Hex(T2.iInt2) ' все просто и понятно и главное работает End Sub '========end============ А теперь пробуем на Net'е '========begin============ 'VB.Net code : Private Declare Sub CopyMemoryLpToLp Lib "kernel32" Alias "RtlMoveMemory" (ByVal pvDest As Integer, ByVal pvSrc As Integer, ByVal Length As Integer) Private Structure MyType1 Dim iInt1 As Integer Dim iInt2 As Integer End Structure Private Structure MyType2 ' может есть другой способ создать структуру? ' ну да ладно, пусть будет так... <VBFixedArray(3)> Dim iBt() As Byte Dim iInt2 As Integer Public Sub Initialize() ReDim iBt(3) End Sub End Structure Private Sub Form_Load() Dim T1 As MyType1 Dim T2 As MyType2 T1.iInt1 = &H31323334 T1.iInt2 = 1 T2.Initialize() 'CopyMemoryLpToLp(VarPtr(T2), VarPtr(T1), Len(T2)) - покойся с миром VarPtr 'хотя ничего не мешает импортнуть (для примитивов) VarPtr из msvbvm* :) 'Попытаемся скопировать через маршалинг CopyMemoryUDTToUDT(T2,T1,Len(T1)) Console.WriteLine(Hex(T2.iBt(0)) & Hex(T2.iBt(1)) & Hex(T2.iBt(2)) & Hex(T2.iBt(3)) & Hex(T2.iInt2))) End Sub 'Пытаемся скопировать, но безрезультатно. Если обе структуры типа MyType1, то проходит Private Sub CopyMemoryUDTToUDT(ByRef pvDest As Object, ByRef pvSrc As Object, ByVal Length As Integer) Dim iRefDst As IntPtr, iRefSrc As IntPtr GetPtrFromVar(pvSrc, iRefSrc, Length) ' ок, в iRefSrc лежит наша структурка GetPtrFromVar(pvDest, iRefDst, Length) ' а в iRefDst лежит... ????? (может мне кто объяснит что там лежит?) CopyMemoryLpToLp(iRefDst.ToInt32, iRefSrc.ToInt32, Length) SetPtrToVar(pvDest, iRefDst) End Sub Private Sub GetPtrFromVar(ByRef oVar As Object, ByRef iPtrOut As IntPtr, Optional ByVal SizeAlloc As Int32 = -1&) If SizeAlloc = -1& Then iPtrOut = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(Marshal.SizeOf(oVar)) Else iPtrOut = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(SizeAlloc) End If System.Runtime.InteropServices.Marshal.StructureToPtr(oVar, iPtrOut, False) End Sub Private Sub SetPtrToVar(ByRef oVar As Object, ByRef iPtrIn As IntPtr) oVar = System.Runtime.InteropServices.Marshal.PtrToStructure(iPtrIn, oVar.GetType) System.Runtime.InteropServices.Marshal.FreeCoTaskMem(iPtrIn) End Sub '========end============
Ответить
|