Como usar o método ReadDirectoryChangesW () com rotina de conclusão?

votos
11

Eu quero usar a função ReadDirectoryChangesW()no modo assíncrono com E / S rotina de conclusão fornecido.

A questão é que eu não sei como recuperar a informação exata sobre a mudança na rotina de conclusão (a CALLBACKfunção). Rotina de conclusão é definida assim:

VOID CALLBACK FileIOCompletionRoutine(
  [in]                 DWORD dwErrorCode,
  [in]                 DWORD dwNumberOfBytesTransfered,
  [in]                 LPOVERLAPPED lpOverlapped
);

Pergunto-me a informação está incluída na LPOVERLAPPEDestrutura. Mas eu não sei como obtê-lo.

Publicado 05/12/2008 em 02:38
fonte usuário
Em outras línguas...                            


1 respostas

votos
3

Excelente pergunta! É 7 anos de atraso, mas aqui está um pouco de uma resposta, ou, mais importante, como encontrá-lo . Assim, a documentação para ReadDirectoryChangesW:

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

na seção Parâmetros dá um link para FileIOCompletionRoutine:

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

que na seção Exemplos dá um link para servidor de pipe nomeado usando auto-completar rotinas:

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

que acredite ou não, não mesmo usar ReadDirectoryChangesW mas realmente dá um exemplo usando ReadFileEx, que também usa FileIOCompletionRoutine:

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

e você pode ver um exemplo deles usando essas duas funções (ReadFileEx e CompletedReadRoutine (que é uma implementação da função de retorno FileIOCompletionRoutine definido pelo aplicativo)) neste pedaço de código:

// 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); 
}

Não é uma grande resposta (eu só estava explorando se eu ainda queria usar essas funções, eu), mas deve ajudar as pessoas a começar.

Veja também:

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

Respondeu 03/10/2015 em 23:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more