Hello ASerge, i did try your example with great interest (such examples are so helpful for users!) and try to summarize my picture what's equal and what's different.
I think the core functionality of monitoring is similar, but simply the method of push back of change info differs a bit.
Your's passes the change info, after GetOverlappedResult, directly back to the Gui (UpdateLog) which is fully appropriate and sufficient for most use cases. Such examples are a valuable source to learn!
Mine is, additionally, using WaitForMultipleObjects and, after the GetOverlappedResult, it passes back the info to the Gui in a deferred way.
By: PostMessage to the parent control (TFldrControl), which stores the data (BufferTheDataViaNotify) in a StringList (where the strings do contain the names, and the objects keep an info about the change type, e.g. "rename"). Then, controlled by a timer, those data are pushed back to the Gui.
Honestly, in a retrospective i do not remember why a thread should be needed for that (should be proven by practice).
If i could do it from the scratch, i would try to use your example as base and extend it a bit for to use buffering (then the using app can decide how to process such changes ... for instance rebuild a list completely or maintain items individually), but without threads.Shouldn't be a big thing-