【问题标题】:How to use ReadDirectoryChangesW() method with completion routine?如何使用带有完成例程的 ReadDirectoryChangesW() 方法?
【发布时间】:2008-12-05 01:38:33
【问题描述】:

我想在异步模式下使用函数ReadDirectoryChangesW(),并提供 I/O 完成例程。

问题是我不知道如何检索有关完成例程中更改的确切信息(CALLBACK 函数)。完成例程定义如下:

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

我想知道这些信息是否包含在LPOVERLAPPED 结构中。但我不知道如何得到它。

【问题讨论】:

    标签: windows asynchronous readdirectorychangesw


    【解决方案1】:

    很好的问题!已经晚了 7 年,但这里有一个答案,或者更重要的是,如何找到它。所以,ReadDirectoryChangesW 的文档:

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

    在参数部分给出了 FileIOCompletionRoutine 的链接:

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

    在示例部分中提供了使用完成例程的命名管道服务器的链接:

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

    信不信由你甚至不使用ReadDirectoryChangesW,但实际上给出了一个使用ReadFileEx的例子,使用了FileIOCompletionRoutine:

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

    您可以在这段代码中看到使用这两个函数(ReadFileEx 和 CompletedReadRoutine(这是应用程序定义的回调函数 FileIOCompletionRoutine 的实现))的示例:

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

    这不是一个很好的答案(我只是在探索我自己是否想使用这些功能),但它应该可以帮助人们入门。

    另见:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多