c++ - IOCP 和 ReadFileEx 用法

标签 c++ windows winapi iocp

我正在玩 IOCP。我正在尝试编写简单的应用程序,异步从主线程中的文件读取数据。但是我在 ReadFileEx 函数中遇到错误(ERROR_INVALID_PARAMETER),但似乎我做得很好。我究竟做错了什么?这是我的示例:

#include "stdafx.h"
#include <windows.h>
#include <assert.h>
#include <stdint.h>

VOID CALLBACK ReadCb(DWORD dwErrorCode,DWORD dwNumberOfBytesTransfered,LPOVERLAPPED lpOverlapped)
{
    fprintf(stderr,"i was here\n");
}


int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE main_io,file_i;
    HANDLE file_handle;
    DWORD bytes_recvd;
    ULONG_PTR data = 0;
    OVERLAPPED overlapped;
    LPOVERLAPPED poverlapped = &overlapped;
    uint8_t read_data[1024];
    DWORD err;

    main_io = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
    assert(main_io != NULL);

    file_handle = CreateFile(L"test.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED, NULL);
    assert(file_handle != INVALID_HANDLE_VALUE);

    file_i = CreateIoCompletionPort(file_handle,main_io,data,0);
    assert(file_i != NULL);

    memset(&overlapped,0,sizeof(OVERLAPPED));

    err = ReadFileEx(file_handle,(LPVOID)read_data,1024,&overlapped,ReadCb);
    fprintf(stderr,"err %d\n",GetLastError());
    assert(err != 0);

    assert(GetQueuedCompletionStatus(file_i,&bytes_recvd,&data,&poverlapped,INFINITE));

    CloseHandle(main_io);
    return 0;
}

最佳答案

“如果函数成功,返回值为非零”——不要为非零返回调用 GetLastError()!在断言检查之后移动 GetLastError 行,这样,如果发生断言违规异常,则不会到达 GetLastError。

关于c++ - IOCP 和 ReadFileEx 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9683441/

相关文章:

c++ - "#define clear()"和 "std::wstring::clear()"之间的混淆

c++ - io_context 究竟是什么?

c++ - 串行通信并更改从属 RAM C 上的变量值

c# - 如何获取窗口类名的长度,以便知道要分配多大的缓冲区?

自定义控件和窗口消息

c++ - 手动调出工具提示? (WinAPI)

c++ - 为什么 C++ 没有反射?

java - 如何将 java 8 添加到 eclipse

c# - 在现有类 c# 中在运行时动态添加属性

c++ - Outlook Express类似地址栏控件的实现方法