Win32 API 日本語リファレンス
ホームStorage.FileSystem › FindNextChangeNotification

FindNextChangeNotification

関数
変更通知を受信した後に次の変更監視を再開する。
DLLKERNEL32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

// KERNEL32.dll
#include <windows.h>

BOOL FindNextChangeNotification(
    HANDLE hChangeHandle
);

パラメーター

名前方向説明
hChangeHandleHANDLEinFindFirstChangeNotification 関数によって作成された変更通知ハンドルへのハンドル。

戻り値の型: BOOL

公式ドキュメント

オペレーティングシステムに対し、次に適切な変更を検出したときに変更通知ハンドルをシグナル状態にするよう要求します。

戻り値

関数が成功した場合、戻り値は 0 以外の値です。

関数が失敗した場合、戻り値は 0 です。拡張エラー情報を取得するには、 GetLastError を呼び出します。

解説(Remarks)

FindNextChangeNotification 関数が正常に戻った後、アプリケーションは 待機関数を使用して、変更が発生したことの通知を待機できます。

FindFirstChangeNotification の呼び出し後、 FindNextChangeNotification の呼び出し前に変更が発生した場合、オペレーティングシステムはその変更を記録します。 FindNextChangeNotification が実行されると、記録された変更によって変更通知の待機が直ちに満たされます。

FindNextChangeNotification の各呼び出しが成功するたびに、その後にいずれかの待機関数を呼び出す必要があります。変更通知ハンドルがシグナル状態になる以外の理由(たとえば待機がタイムアウトした場合)で待機関数が戻った場合、アプリケーションは待機を再試行する必要があります。このルールに従わないと、最終的にシステムのリソースが枯渇する可能性があります。また、一部の変更通知を見落とす原因にもなります。

hChangeHandle が不要になったら、 FindCloseChangeNotification 関数を使用して閉じます。

Windows 8 および Windows Server 2012 では、この関数は次の技術でサポートされています。

技術 サポート
Server Message Block (SMB) 3.0 プロトコル はい
SMB 3.0 トランスペアレントフェールオーバー (TFO) はい
SMB 3.0 とスケールアウトファイル共有 (SO) はい
クラスター共有ボリュームファイルシステム (CsvFS) 備考を参照
回復性ファイルシステム (ReFS) はい

アプリケーションは、CsvFs の一時停止/再開時に誤検出が発生する可能性があります。

例については、 ディレクトリ変更通知の取得を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// KERNEL32.dll
#include <windows.h>

BOOL FindNextChangeNotification(
    HANDLE hChangeHandle
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool FindNextChangeNotification(
    IntPtr hChangeHandle   // HANDLE
);
<DllImport("KERNEL32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function FindNextChangeNotification(
    hChangeHandle As IntPtr   ' HANDLE
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' hChangeHandle : HANDLE
Declare PtrSafe Function FindNextChangeNotification Lib "kernel32" ( _
    ByVal hChangeHandle As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

FindNextChangeNotification = ctypes.windll.kernel32.FindNextChangeNotification
FindNextChangeNotification.restype = wintypes.BOOL
FindNextChangeNotification.argtypes = [
    wintypes.HANDLE,  # hChangeHandle : HANDLE
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
FindNextChangeNotification = Fiddle::Function.new(
  lib['FindNextChangeNotification'],
  [
    Fiddle::TYPE_VOIDP,  # hChangeHandle : HANDLE
  ],
  Fiddle::TYPE_INT)
#[link(name = "kernel32")]
extern "system" {
    fn FindNextChangeNotification(
        hChangeHandle: *mut core::ffi::c_void  // HANDLE
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true)]
public static extern bool FindNextChangeNotification(IntPtr hChangeHandle);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_FindNextChangeNotification' -Namespace Win32 -PassThru
# $api::FindNextChangeNotification(hChangeHandle)
#uselib "KERNEL32.dll"
#func global FindNextChangeNotification "FindNextChangeNotification" sptr
; FindNextChangeNotification hChangeHandle   ; 戻り値は stat
; hChangeHandle : HANDLE -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "KERNEL32.dll"
#cfunc global FindNextChangeNotification "FindNextChangeNotification" sptr
; res = FindNextChangeNotification(hChangeHandle)
; hChangeHandle : HANDLE -> "sptr"
; BOOL FindNextChangeNotification(HANDLE hChangeHandle)
#uselib "KERNEL32.dll"
#cfunc global FindNextChangeNotification "FindNextChangeNotification" intptr
; res = FindNextChangeNotification(hChangeHandle)
; hChangeHandle : HANDLE -> "intptr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procFindNextChangeNotification = kernel32.NewProc("FindNextChangeNotification")
)

// hChangeHandle (HANDLE)
r1, _, err := procFindNextChangeNotification.Call(
	uintptr(hChangeHandle),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function FindNextChangeNotification(
  hChangeHandle: THandle   // HANDLE
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'FindNextChangeNotification';
result := DllCall("KERNEL32\FindNextChangeNotification"
    , "Ptr", hChangeHandle   ; HANDLE
    , "Int")   ; return: BOOL
●FindNextChangeNotification(hChangeHandle) = DLL("KERNEL32.dll", "bool FindNextChangeNotification(void*)")
# 呼び出し: FindNextChangeNotification(hChangeHandle)
# hChangeHandle : HANDLE -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn FindNextChangeNotification(
    hChangeHandle: ?*anyopaque // HANDLE
) callconv(std.os.windows.WINAPI) i32;
proc FindNextChangeNotification(
    hChangeHandle: pointer  # HANDLE
): int32 {.importc: "FindNextChangeNotification", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
int FindNextChangeNotification(
    void* hChangeHandle   // HANDLE
);
ccall((:FindNextChangeNotification, "KERNEL32.dll"), stdcall, Int32,
      (Ptr{Cvoid},),
      hChangeHandle)
# hChangeHandle : HANDLE -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t FindNextChangeNotification(
    void* hChangeHandle);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.FindNextChangeNotification(hChangeHandle)
-- hChangeHandle : HANDLE
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const FindNextChangeNotification = lib.func('__stdcall', 'FindNextChangeNotification', 'int32_t', ['void *']);
// FindNextChangeNotification(hChangeHandle)
// hChangeHandle : HANDLE -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  FindNextChangeNotification: { parameters: ["pointer"], result: "i32" },
});
// lib.symbols.FindNextChangeNotification(hChangeHandle)
// hChangeHandle : HANDLE -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t FindNextChangeNotification(
    void* hChangeHandle);
C, "KERNEL32.dll");
// $ffi->FindNextChangeNotification(hChangeHandle);
// hChangeHandle : HANDLE
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
    boolean FindNextChangeNotification(
        Pointer hChangeHandle   // HANDLE
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun FindNextChangeNotification = FindNextChangeNotification(
    hChangeHandle : Void*   # HANDLE
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef FindNextChangeNotificationNative = Int32 Function(Pointer<Void>);
typedef FindNextChangeNotificationDart = int Function(Pointer<Void>);
final FindNextChangeNotification = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<FindNextChangeNotificationNative, FindNextChangeNotificationDart>('FindNextChangeNotification');
// hChangeHandle : HANDLE -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function FindNextChangeNotification(
  hChangeHandle: THandle   // HANDLE
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'FindNextChangeNotification';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "FindNextChangeNotification"
  c_FindNextChangeNotification :: Ptr () -> IO CInt
-- hChangeHandle : HANDLE -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let findnextchangenotification =
  foreign "FindNextChangeNotification"
    ((ptr void) @-> returning int32_t)
(* hChangeHandle : HANDLE -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("FindNextChangeNotification" find-next-change-notification :convention :stdcall) :int32
  (h-change-handle :pointer))   ; HANDLE
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $FindNextChangeNotification = Win32::API::More->new('KERNEL32',
    'BOOL FindNextChangeNotification(HANDLE hChangeHandle)');
# my $ret = $FindNextChangeNotification->Call($hChangeHandle);
# hChangeHandle : HANDLE -> HANDLE
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目