SafeHandleZeroOrMinusOneIsInvalid Class

Note: This class is new in the .NET Framework version 2.0.

Provides a base class for Win32 safe handle implementations in which the value of either 0 or -1 indicates an invalid handle.

Namespace: Microsoft.Win32.SafeHandles
Assembly: mscorlib (in mscorlib.dll)

'Declaration
Public MustInherit Class SafeHandleZeroOrMinusOneIsInvalid
	Inherits SafeHandle
'Usage
Dim instance As SafeHandleZeroOrMinusOneIsInvalid

public abstract class SafeHandleZeroOrMinusOneIsInvalid extends SafeHandle
public abstract class SafeHandleZeroOrMinusOneIsInvalid extends SafeHandle

This class derives from the System.Runtime.InteropServices.SafeHandle class. It describes the format of an invalid handle. For example, some handles use -1 as an invalid handle value, while others use 0. Further derivations of this class (for example, file or registry handles) can specialize this further. See the SafeFileHandle class for an example of a class that derives from SafeHandleZeroOrMinusOneIsInvalid.

Use the SafeHandleZeroOrMinusOneIsInvalid class whenever you need to safely wrap an unmanaged resource that does not have an existing managed wrapper.

The following code example demonstrates how to create a class that derives from the SafeHandleZeroOrMinusOneIsInvalid class. This example creates a class that wraps a pointer to unmanaged memory.

Imports System
Imports System.Security.Permissions
Imports System.Runtime.InteropServices
Imports Microsoft.Win32.SafeHandles



Module Example

    Sub Main()

        Dim ptr As IntPtr = Marshal.AllocHGlobal(10)

        Console.WriteLine("Ten bytes of unmanaged memory allocated.")

        Dim memHabdle As New SafeUnmanagedMemoryHandle(ptr, True)

        If memHabdle.IsInvalid Then
            Console.WriteLine("SafeUnmanagedMemoryHandle is invalid!.")
        Else
            Console.WriteLine("SafeUnmanagedMemoryHandle class initialized to unmanaged memory.")
        End If

        Console.ReadLine()

    End Sub
End Module




' Demand unmanaged code permission to use this class.
<SecurityPermission(SecurityAction.Demand, UnmanagedCode:=True)> _
NotInheritable Class SafeUnmanagedMemoryHandle
    Inherits SafeHandleZeroOrMinusOneIsInvalid


    ' Set ownsHandle to true for the default constructor.
    Friend Sub New()
        MyBase.New(True)

    End Sub 'New

    ' Set the handle and set ownsHandle to true.
    Friend Sub New(ByVal preexistingHandle As IntPtr, ByVal ownsHandle As Boolean)
        MyBase.New(ownsHandle)
        SetHandle(preexistingHandle)

    End Sub 'New


    ' Perform any specific actions to release the 
    ' handle in the ReleaseHandle method.
    ' Often, you need to use Pinvoke to make
    ' a call into the Win32 API to release the 
    ' handle. In this case, however, we can use
    ' the Marshal class to release the unmanaged
    ' memory.
    Protected Overrides Function ReleaseHandle() As Boolean
        ' "handle" is the internal
        ' value for the IntPtr handle.
        ' If the handle was set,
        ' free it. Return success.
        If handle <> IntPtr.Zero Then

            ' Free the handle.
            Marshal.FreeHGlobal(handle)

            ' Set the handle to zero.
            handle = IntPtr.Zero

            ' Return success.
            Return True
        End If

        ' Return false. 
        Return False

    End Function
End Class


Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see System Requirements.

.NET Framework

Supported in: 2.0

.NET Compact Framework

Supported in: 2.0

Community Additions

ADD
Show: