Я хочу сделать асинхронное чтение на стандартный ввод в Windows с портами завершения ввода-вывода, но этот код не работает:
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "Kernel32.lib")
int main() {
HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD number;
HANDLE iocp = CreateIoCompletionPort(handle, NULL, 0, 0);
if (iocp == NULL) {
printf("error : %d\n", GetLastError());
}
}
Я получаю ошибку 87: ERROR_INVALID_PARAMETER
Я не нахожу ничего, чтобы открыть стандартный ввод с помощью async...
если вы нацелены только на последнюю версию Windows (8+), вам нужно CreateFile(L"CONIN$", FILE_GENERIC_READ, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
вместо GetStdHandle(STD_INPUT_HANDLE);
после этого вы можете использовать CreateIoCompletionPort
, но намного лучше, и просто использовать BindIoCompletionCallback
здесь. еще вопрос, какой общий логический скелет вы хотите получить здесь
CreateIOCompletionPort нельзя использовать напрямую с stdin/stdout. Проверьте это. Либо используйте поток, либо перенаправьте stdin/stdout на именованные каналы.
Спасибо ! Думаю, я создам тему... Windows API очень странный по сравнению с UNIX API
Забудьте обо всем, что исходит от unix при программировании окон, а также используйте std::thread для простых потоков.
действительно можно использовать. мы можем открыть консоль в асинхронном режиме CreateFile(L"CONIN$", FILE_GENERIC_READ, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
, а затем привязать ее к iocp или лучше через BindIoCompletionCallback
. но это будет работать с win7 или win8 (уже забыл), когда модель консоли изменилась, а не консольные дескрипторы действительно дескриптор файла
Для IOCP требуются дескрипторы файлов, которые были открыты с помощью асинхронного режима. Я не верю, что можно открыть stdin/stdout с помощью async.