Работают ли порты завершения ввода-вывода Windows с классами в качестве ключей завершения?
TLDR - GetQueuedCompletionStatus
не возвращает, если я предоставляю объект класса в качестве ключа завершения, он возвращает, только если вместо этого передан объект структуры.
Я создал IOCP в основном потоке, используя CreateIoCompletionPort
ShareInfo* l_poShareInfo = new ShareInfo(hDir, p_sSharePath, p_oChangeHandler, dwChangesToMonitor, true);
m_hCompPort = CreateIoCompletionPort(hDir, m_hCompPort, (ULONG_PTR)&l_poShareInfo, 0);
а потом я жду данных в рабочем потоке, используя GetQueuedCompletionStatus
ShareInfo* l_ShareInfo;
GetQueuedCompletionStatus((HANDLE)l_pThis->m_hCompPort, &nBytes, (PULONG_PTR)&l_ShareInfo, &lpOverlapped, INFINITE);
ShareInfo
класс следующим образом, чей объект я использую в качестве ключа завершения.
class ShareInfo
{
public:
ShareInfo();
ShareInfo(HANDLE p_hDir, const std::wstring & p_sSharePath, FileChangeHandlerBase * p_poChangeHandler, DWORD p_dwChangeFilter, bool p_bWatchSubDir);
~ShareInfo();
OVERLAPPED m_Overlapped;
HANDLE m_hDir;
TCHAR m_sSharePath[MAX_PATH];
CHAR m_Buffer[4096];
DWORD m_dwBufLength;
DWORD m_dwChangeFilter;
FileChangeHandlerBase* m_poChangeHandler;
BOOL m_bWatchSubDir;
};
Тем не мение, GetQueuedCompletionStatus
не возвращается Если я предоставлю объект структуры вместо объекта класса, он будет работать как положено. Поэтому мне пришлось преобразовать свой класс следующим образом и использовать объект ShareInfo::ShareInfoData
как ключ завершения.
class ShareInfo
{
public:
.
.
typedef struct
{
OVERLAPPED m_Overlapped;
HANDLE m_hDir;
TCHAR m_sSharePath[MAX_PATH];
CHAR m_Buffer[4096];
DWORD m_dwBufLength;
DWORD m_dwChangeFilter;
FileChangeHandlerBase* m_poChangeHandler;
}ShareInfoData;
ShareInfoData m_shareInfoData;
BOOL m_bWatchSubDir;
};
Я подозреваю, что ключи завершения не могут быть классами, но я не нахожу ничего упомянутого в официальных документах. Я что-то упустил здесь?