RegisterWaitForSingleObject使用RealBasic观看目录

我正在尝试使用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(即,当目录中发生更改时),事情变得......很奇怪。应用程序从Process Explorer和Windows资源管理器开始崩溃或锁定。我必须退出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中有一些限制导致回调内爆系统?     
已邀请:
您在
RegisterWaitForSingleObject()
中注册的回调函数在另一个线程上调用(http://msdn.microsoft.com/en-us/library/ms685061.aspx):   当对象的状态变为信号或超时间隔过去时,回调例程由工作线程执行。 我对RealBasic的线程支持一无所知,但至少Windows上的GUI操作通常需要在特定的线程上进行,而不仅仅是任何旧的工作线程。因此,在该工作线程上调用
MsgBox()
可能是一个问题。 您可以尝试的一个简单的事情是调用
PostMessage()
(或RealBasic的等价物)将自定义消息发布到您的应用程序可以响应的窗口消息队列中(例如通过调用
MsgBox()
)。     
也许没有关系,但MyCallBackFn()声明在哪里?如果它是实例方法,则应使用WeakAddressOf而不是AddressOf。     

要回复问题请先登录注册