Я играю с IOCP. Я пытаюсь написать простое приложение, которое async считывает данные из файла в основном потоке. Однако я получаю ошибку (ERROR_INVALID_PARAMETER) в функции ReadFileEx, но, похоже, я делаю это нормально. Что я делаю не так? Вот мой пример:Использование IOCP и ReadFileEx
#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;
}
Вы можете использовать OVERLAPPED overlapped = {}; вместо memset (& overlapped, 0, sizeof (OVERLAPPED)); – evpo