How to use ReadDirectoryChangesW() method with completion routine? How to use ReadDirectoryChangesW() method with completion routine? windows windows

How to use ReadDirectoryChangesW() method with completion routine?


Excellent question! It's 7 years late, but here's somewhat of an answer, or, more importantly, how to find it. So, the documentation for ReadDirectoryChangesW:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465%28v=vs.85%29.aspx

in the Parameters section gives a link to FileIOCompletionRoutine:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364052%28v=vs.85%29.aspx

which in the Examples section gives a link to Named Pipe Server Using Completion Routines:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365601%28v=vs.85%29.aspx

which believe it or not doesn't even use ReadDirectoryChangesW but actually gives an example using ReadFileEx, which also uses FileIOCompletionRoutine:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365468%28v=vs.85%29.aspx

and you can see an example of them using these two functions (ReadFileEx and CompletedReadRoutine (which is an implementation of the application-defined callback function FileIOCompletionRoutine)) in this piece of code:

// CompletedWriteRoutine(DWORD, DWORD, LPOVERLAPPED) // This routine is called as a completion routine after writing to // the pipe, or when a new client has connected to a pipe instance.// It starts another read operation.     VOID WINAPI CompletedWriteRoutine(DWORD dwErr, DWORD cbWritten,     LPOVERLAPPED lpOverLap) {     LPPIPEINST lpPipeInst;     BOOL fRead = FALSE;     // lpOverlap points to storage for this instance.         lpPipeInst = (LPPIPEINST) lpOverLap;     // The write operation has finished, so read the next request (if // there is no error).         if ((dwErr == 0) && (cbWritten == lpPipeInst->cbToWrite))         fRead = ReadFileEx(             lpPipeInst->hPipeInst,             lpPipeInst->chRequest,             BUFSIZE*sizeof(TCHAR),             (LPOVERLAPPED) lpPipeInst,             (LPOVERLAPPED_COMPLETION_ROUTINE) CompletedReadRoutine);     // Disconnect if an error occurred.         if (! fRead)         DisconnectAndClose(lpPipeInst); }     // CompletedReadRoutine(DWORD, DWORD, LPOVERLAPPED) // This routine is called as an I/O completion routine after reading // a request from the client. It gets data and writes it to the pipe.     VOID WINAPI CompletedReadRoutine(DWORD dwErr, DWORD cbBytesRead,     LPOVERLAPPED lpOverLap) {     LPPIPEINST lpPipeInst;     BOOL fWrite = FALSE;     // lpOverlap points to storage for this instance.         lpPipeInst = (LPPIPEINST) lpOverLap;     // The read operation has finished, so write a response (if no // error occurred).         if ((dwErr == 0) && (cbBytesRead != 0))     {         GetAnswerToRequest(lpPipeInst);             fWrite = WriteFileEx(             lpPipeInst->hPipeInst,             lpPipeInst->chReply,             lpPipeInst->cbToWrite,             (LPOVERLAPPED) lpPipeInst,             (LPOVERLAPPED_COMPLETION_ROUTINE) CompletedWriteRoutine);     }     // Disconnect if an error occurred.         if (! fWrite)         DisconnectAndClose(lpPipeInst); }

It's not a great answer (I was only exploring whether I even wanted to use these functions, myself), but it should help people get started.

See also:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365261%28v=vs.85%29.aspx