| File: Microsoft\VisualBasic\Helpers\NativeTypes.STARTUPINFO.vb | Web Access |
| Project: src\winforms\src\Microsoft.VisualBasic.Forms\src\Microsoft.VisualBasic.Forms.vbproj (Microsoft.VisualBasic.Forms) |
' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. Imports System.Runtime.InteropServices Namespace Microsoft.VisualBasic.CompilerServices Partial Friend NotInheritable Class NativeTypes #Disable Warning CA1812 ' Supress warning as this is a type used in PInvoke and shouldn't be changed. ''' <summary> ''' Important! This class should be used where the API being called has allocated the strings. That is why lpReserved, etc. are declared as IntPtrs instead ''' of Strings - so that the marshaling layer won't release the memory. This caused us problems in the shell() functions. We would call GetStartupInfo() ''' which doesn't expect the memory for the strings to be freed. But because the strings were previously defined as type String, the marshaller would ''' and we got memory corruption problems detectable while running AppVerifier. ''' If you use this structure with an API like CreateProcess() then you are supplying the strings so you'll need another version of this class that defines lpReserved, etc. ''' as String so that the memory will get cleaned up. ''' </summary> <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> Friend NotInheritable Class STARTUPINFO Implements IDisposable Public cb As Integer Public lpReserved As IntPtr = IntPtr.Zero 'not string - see summary Public lpDesktop As IntPtr = IntPtr.Zero 'not string - see summary Public lpTitle As IntPtr = IntPtr.Zero 'not string - see summary Public dwX As Integer Public dwY As Integer Public dwXSize As Integer Public dwYSize As Integer Public dwXCountChars As Integer Public dwYCountChars As Integer Public dwFillAttribute As Integer Public dwFlags As Integer Public wShowWindow As Short Public cbReserved2 As Short Public lpReserved2 As IntPtr = IntPtr.Zero Public hStdInput As IntPtr = IntPtr.Zero Public hStdOutput As IntPtr = IntPtr.Zero Public hStdError As IntPtr = IntPtr.Zero Friend Sub New() End Sub ' To detect redundant calls. Default initialize = False. Private _hasBeenDisposed As Boolean Protected Overrides Sub Finalize() Dispose(False) End Sub ' IDisposable Private Sub Dispose(disposing As Boolean) If Not _hasBeenDisposed Then If disposing Then _hasBeenDisposed = True ' 256 Defined in windows.h Const STARTF_USESTDHANDLES As Integer = 256 If (dwFlags And STARTF_USESTDHANDLES) <> 0 Then If hStdInput <> IntPtr.Zero AndAlso hStdInput <> s_invalidHandle Then NativeMethods.CloseHandle(hStdInput) hStdInput = s_invalidHandle End If If hStdOutput <> IntPtr.Zero AndAlso hStdOutput <> s_invalidHandle Then NativeMethods.CloseHandle(hStdOutput) hStdOutput = s_invalidHandle End If If hStdError <> IntPtr.Zero AndAlso hStdError <> s_invalidHandle Then NativeMethods.CloseHandle(hStdError) hStdError = s_invalidHandle End If End If 'Me.dwFlags and STARTF_USESTDHANDLES End If End If End Sub ' This code correctly implements the disposable pattern. Friend Sub Dispose() Implements IDisposable.Dispose ' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above. Dispose(True) GC.SuppressFinalize(Me) End Sub End Class End Class End Namespace