home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2005 June (DVD) / DPPRO0605DVD.iso / dotNETSDK / SETUP.EXE / netfxsd1.cab / FL_OutArrayOfStructs_vb________.3643236F_FC70_11D3_A536_0090278A1BB8 < prev    next >
Encoding:
Text File  |  2001-08-27  |  1.6 KB  |  74 lines

  1. ' Copyright
  2. ' Microsoft Corporation
  3. ' All rights reserved
  4.  
  5. ' OutArrayOfStructs.vb
  6.  
  7. Imports System
  8. Imports Microsoft.VisualBasic
  9. Imports System.Runtime.InteropServices
  10.  
  11. 'typedef struct _MYSTRSTRUCT2
  12. '{
  13. '    char* buffer;
  14. '    UINT size; 
  15. '} MYSTRSTRUCT2;
  16.  
  17. < StructLayout( LayoutKind.Sequential, CharSet:=CharSet.Ansi )> _
  18. Public Class MyStruct 
  19.  
  20.     Public buffer As String 
  21.     Public someSize As Integer
  22.     
  23. End Class 'MyStruct
  24.  
  25. Public Class LibWrap
  26.  
  27.     ' void TestOutArrayOfStructs(int* pSize, MYSTRSTRUCT2** ppStruct);    
  28.     
  29.     Declare Sub TestOutArrayOfStructs Lib "..\\LIB\\PinvokeLib.dll" ( _
  30.         ByRef arrSize As Integer, ByRef outArray As IntPtr )
  31.         
  32. End Class 'LibWrap
  33.  
  34. Public Class App
  35.  
  36.     Public Shared Sub Main()
  37.     
  38.         Console.WriteLine( ControlChars.CrLf & "Using marshal class" & ControlChars.CrLf )
  39.         UsingMarshal()
  40.         
  41.         'VB.NET can't use unsafe code
  42.         
  43.     End Sub 'Main
  44.     
  45.     Public Shared Sub UsingMarshal()    
  46.     
  47.         Dim arrSize As Integer
  48.         Dim outArray As IntPtr
  49.         
  50.         LibWrap.TestOutArrayOfStructs( arrSize, outArray )
  51.         
  52.         Dim manArray(arrSize - 1) As MyStruct
  53.         
  54.         Dim current As IntPtr = outArray
  55.         Dim i As Integer
  56.         
  57.         For i = 0 To arrSize - 1
  58.         
  59.             manArray(i) = New MyStruct()
  60.             Marshal.PtrToStructure( current, manArray(i))
  61.             
  62.             Marshal.DestroyStructure( current, GetType( MyStruct )) 
  63.             current = IntPtr.op_explicit( current.ToInt32() + Marshal.SizeOf( manArray(i) ))
  64.             
  65.             Console.WriteLine( "Element {0}: {1} {2}", i, manArray(i).buffer, manArray(i).someSize )
  66.         Next i
  67.         Marshal.FreeCoTaskMem( outArray )
  68.         
  69.     End Sub 'UsingMarshal
  70.     
  71. End Class 'App
  72.  
  73.  
  74.