Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница:

 

  Вопрос: VB->VB.Net копирование UDT Добавлено: 09.07.03 13:09  

Автор вопроса:  BackDoor

В ходе изучения 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============

Ответить

  Ответы Всего ответов: 0  

Нет ответов

Страница:

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам