IntPtr.Zero フィールド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
0 に初期化された符号付き整数を表す読み取り専用フィールド。
public: static initonly IntPtr Zero;
public static readonly IntPtr Zero;
staticval mutable Zero : nativeint
Public Shared ReadOnly Zero As IntPtr
フィールド値
nativeint
注釈
このフィールドの値は、 nullと同じではありません。 このフィールドを使用して、 IntPtr のインスタンスが 0 以外の値に設定されているかどうかを効率的に判断します。
たとえば、変数 ip が IntPtrのインスタンスであるとします。 設定されているかどうかを判断するには、コンストラクターから返された値と比較します (例: " if ip != new IntPtr(0)... ")。 ただし、コンストラクターを呼び出して初期化されていないポインターを取得するのは非効率的です。 " if ip != IntPtr.Zero... "、または " if !IntPtr.Zero.Equals(ip)... " のいずれかをコーディングすることをお勧めします。
マネージド コードから Windows API を呼び出すときに、引数がポインターまたは IntPtr.Zero である必要がある場合は、null の代わりに null を渡すことができます。 たとえば、Windows CreateFile 関数の次の呼び出しでは、IntPtr.Zero および pSecurityAttributes 引数の値に対して hTemplateFile が提供されます。
using Microsoft.Win32.SafeHandles;
using System;
using System.Runtime.InteropServices;
public class Example
{
private const uint GENERIC_READ = 0x80000000;
private const uint OPEN_EXISTING = 3;
private const uint FILE_ATTRIBUTE_NORMAL = 128;
private const uint FILE_FLAG_OVERLAPPED = 0x40000000;
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(
string lpFileName, System.UInt32 dwDesiredAccess, System.UInt32 dwShareMode,
IntPtr pSecurityAttributes, System.UInt32 dwCreationDisposition,
System.UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile);
public static void Main()
{
SafeFileHandle hnd = CreateFile("CallOfTheWild.txt", GENERIC_READ, 0,
IntPtr.Zero, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
IntPtr.Zero);
if (hnd.IsInvalid) {
Exception ex = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
Console.WriteLine("Attempt to open file failed:");
Console.WriteLine(" {0}", ex.Message);
return;
}
else {
Console.WriteLine("File successfully opened.");
hnd.Close();
}
}
}
// If the file cannot be found, the example displays the following output:
// Attempt to open file failed:
// The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
open Microsoft.Win32.SafeHandles
open System
open System.Runtime.InteropServices
let GENERIC_READ = 0x80000000u
let OPEN_EXISTING = 3u
let FILE_ATTRIBUTE_NORMAL = 128u
let FILE_FLAG_OVERLAPPED = 0x40000000u
[<DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)>]
extern SafeFileHandle CreateFile(
string lpFileName, uint dwDesiredAccess, uint dwShareMode,
nativeint pSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, nativeint hTemplateFile)
let hnd =
CreateFile("CallOfTheWild.txt", GENERIC_READ, 0u,
IntPtr.Zero, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL ||| FILE_FLAG_OVERLAPPED,
IntPtr.Zero)
if hnd.IsInvalid then
let ex = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error())
printfn $"Attempt to open file failed:\n {ex.Message}"
else
printfn "File successfully opened."
hnd.Close()
// If the file cannot be found, the example displays the following output:
// Attempt to open file failed:
// The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
Imports Microsoft.Win32.SafeHandles
Imports System.Runtime.InteropServices
Module Example
Private Const GENERIC_READ As UInteger = 2147483648
Private Const OPEN_EXISTING As UInteger = 3
Private Const FILE_ATTRIBUTE_NORMAL As UInteger = 128
Private Const FILE_FLAG_OVERLAPPED As UInteger = &h40000000
Private Declare Auto Function CreateFile Lib "Kernel32" Alias "CreateFileW" (
lpFileName As String, dwDesiredAccess As UInt32,
dwShareMode As UInt32, pSecurityAttributes As IntPtr,
dwCreationDisposition As UInt32, dwFlagsAndAttributes As UInt32,
hTemplateFile As IntPtr) As SafeFileHandle
Public Sub Main()
Dim hnd As SafeFileHandle = CreateFile("CallOfTheWild.txt", GENERIC_READ, 0,
IntPtr.Zero, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED,
IntPtr.Zero)
If hnd.IsInvalid Then
Dim ex As Exception = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error())
Console.WriteLine("Attempt to open file failed:")
Console.WriteLine(" {0}", ex.Message)
Return
Else
Console.WriteLine("File successfully opened.")
hnd.Close()
End If
End Sub
End Module
' If the file cannot be found, the example displays the following output:
' Attempt to open file failed:
' The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
Note
Zero は、パラメーターまたは戻り値がポインターまたは null であるWindows API 関数の場合、null と同じですが、Zero は null と同等ではありません。
null メソッドにIntPtr.Zero.Equalsを渡すと、常にfalseが返されます。
また、戻り値を null と比較して、ポインターまたは Windows null を返す api 関数呼び出しからIntPtr.Zero戻り値をテストすることもできます。 たとえば、次の例の GetWindow 関数の呼び出しは、存在しないウィンドウのハンドルを取得しようとします。 アンマネージ コードから呼び出された場合、関数は nullを返しますが、マネージド コードから呼び出されると、 IntPtr.Zeroを返します。
using System;
using System.Runtime.InteropServices;
public class Example
{
private const int GW_OWNER = 4;
[DllImport("user32", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true)]
public static extern IntPtr GetWindow(IntPtr hwnd, int wFlag);
public static void Main()
{
IntPtr hwnd = new IntPtr(3);
IntPtr hOwner = GetWindow(hwnd, GW_OWNER);
if (hOwner == IntPtr.Zero)
Console.WriteLine("Window not found.");
}
}
// The example displays the following output:
// Window not found.
open System
open System.Runtime.InteropServices
let GW_OWNER = 4
[<DllImport("user32", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true)>]
extern IntPtr GetWindow(nativeint hwnd, int wFlag)
let hwnd = IntPtr 3
let hOwner = GetWindow(hwnd, GW_OWNER)
if hOwner = IntPtr.Zero then
printfn "Window not found."
// The example displays the following output:
// Window not found.
Module Example
Private Const GW_OWNER As Integer = 4
Private Declare Function GetWindow Lib "user32" (hWnd As IntPtr,
wFlag As Integer) As IntPtr
Public Sub Main()
Dim hwnd = new IntPtr(3)
Dim hOwner As IntPtr = GetWindow(hwnd, GW_OWNER)
If hOwner = IntPtr.Zero Then
Console.WriteLine("Window not found.")
End If
End Sub
End Module
' The example displays the following output:
' Window not found.