Работают ли порты завершения ввода-вывода Windows с классами в качестве ключей завершения? - PullRequest
0 голосов
/ 10 октября 2018

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

Я подозреваю, что ключи завершения не могут быть классами, но я не нахожу ничего упомянутого в официальномDocs.Я что-то упустил здесь?

...