FindFirstChangeNotification関数を使用して、ディレクトリの変更を監視しようとしています。これは、FindFirstChangeNotificationによって返されたハンドルを取得し、それをWaitForSingleObjectに詰め込んだ場合に機能します。問題は、WaitForSingleObjectがアプリケーションが戻るまでアプリケーション全体をブロックすることです。
それで、私は周りを見回しました、そして、RegisterWaitForSingleObjectが行く方法であったようです:
Sub monitorDir(dir As FolderItem)
Declare Function FindFirstChangeNotificationW Lib "Kernel32" (dirPath As WString, watchChildren As Boolean, eventTypeFilter As Integer) As Integer
Declare Function RegisterWaitForSingleObject Lib "Kernel32" (ByRef waiterHWND As Integer, HWND As Integer, cllbck As Ptr, _
context As Integer, wait As Integer, flags As Integer) As Integer
Dim allFilters As Integer = &h00000001 Or &h00000002 Or &h00000004 Or &h00000008 Or &h00000010_
Or &h00000100
Dim monitorHandle As Integer = FindFirstChangeNotificationW(dir.AbsolutePath, True, allFilters)
If monitorHandle <> 0 Then
Call RegisterWaitForSingleObject(myCallbackHWND, monitorHandle, AddressOf MyCallbackFn, 0, &hFFFFFFFF, 0)
End Sub
これは、アプリケーションが正常に実行され続けるため、機能しているように見えます。ただし、MyCallbackFnが呼び出されるとすぐに(つまり、ディレクトリで変更が発生すると)、状況は奇妙になります。ProcessExplorerおよびWindowsExplorerから、アプリケーションがクラッシュまたはロックアップし始めます。復元するには、Windowsからログアウトする必要があります。
現時点では、MyCallbackFnが行うことはこれだけです。
Sub MyCallbackFn()
Declare Function UnregisterWaitEx Lib "Kernel32" (waitHWND As Integer, eventHandle As Integer) As Integer
Call UnregisterWaitEx(myCallbackHWND, 0)
MsgBox("Change Detected")
End Sub
RegisterWaitForSingleObjectを使用して間違ったツリーを吠えていますか、それを間違って使用しましたか、またはコールバックがシステムを内破する原因となるRealBasicにいくつかの制限がありますか?