2009-06-02 85 views
1

的Win32 ReadFileEx被定義爲:如何爲上下文信息提供ReadFileEx()的完成例程?

BOOL WINAPI ReadFileEx(
    __in  HANDLE hFile, 
    __out_opt LPVOID lpBuffer, 
    __in  DWORD nNumberOfBytesToRead, 
    __inout LPOVERLAPPED lpOverlapped, 
    __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine 
); 

我試圖找出如何使操作完成,當完成例程(最後一個參數)調用動態函數指針。似乎沒有辦法傳遞用戶數據。有任何想法嗎?

回答

3

將傳入ReadFileEx的lpOverlapped函數傳遞給lpCompletionRoutine函數。

你可以在你自己的結構嵌入lpOverlapped的,然後用它來找到指向您的上下文:

struct ReadFileExContext 
{ 
    OVERLAPPED _Overlapped; 
    LPVOID MyContext; 
}; 

然後在你的回調函數,你投的LPOVERLAPPED到ReadFileContext,你是好走。

+1

所以...... hackish ......必須......抵制......假設沒有更好的方法來做到這一點,你的方法似乎比使用TLS(這在C++中又是一團糟)更簡單。謝謝:) – Gili 2009-06-02 19:47:31

-1

您可以使用Thread Local Storage ...只需創建一個插槽並存儲指向您想要的任何數據的指針。由於lpCompletionRoutine在調用線程上運行,你應該沒問題。

1

當前正在做一些IO工作,並且在WSA和File讀/寫功能中注意到,如果您正在使用完成例程,則不會使用OVERLAPPED結構的事件。 from ReadFileEx

ReadFileEx函數忽略OVERLAPPED結構的hEvent成員。在ReadFileEx調用的上下文中,應用程序可以自由使用該成員。 ReadFileEx通過調用lpCompletionRoutine指向的完成例程來調用或排隊調用來完成其讀取操作,因此它不需要事件句柄。

相關問題