Мне удалось использовать ReadDirectoryChangesW
синхронно, но когда я пытаюсь использовать порты завершения, ReadDirectoryChangesW
всегда возвращает ERROR_INVALID_PARAMETER
. Я предполагаю, что в моем коде должна быть очевидная ошибка, но я не могу понять.Асинхронный ReadDirectoryChangesW не работает с ERROR_INVALID_PARAMETER
Мой код основан на How to use ReadDirectoryChangesW() method with completion routine?
const wchar_t *directory = L"X:\\X";
HANDLE h = CreateFile(
directory,
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, NULL);
if (h==INVALID_HANDLE_VALUE) return;
HANDLE p = CreateIoCompletionPort(h,0,0,1);
if (p==NULL) {CloseHandle(h); return;}
DWORD *buffer =new DWORD[4096];
DWORD bytesReturned;
DWORD notifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME
| FILE_NOTIFY_CHANGE_DIR_NAME
| FILE_NOTIFY_CHANGE_SIZE
| FILE_NOTIFY_CHANGE_LAST_WRITE;
while (true) {
OVERLAPPED overlapped;
memset(&overlapped,0,sizeof(overlapped));
BOOL success = ReadDirectoryChangesW(h,
&buffer[0],
4096*sizeof(DWORD),
FALSE, notifyFilter,
NULL, //&bytesReturned,
&overlapped,myFileIOCompletionRoutine);
if (!success) {
//always ERROR_INVALID_PARAMETER
CloseHandle(h);
CloseHandle(p);
return;
}
}
Вы не указали notifyFilter и myFileIOCompletionRoutine определения. –
CreateIoCompletionPort возвращает NULL, если сбой, ваш тест неверен. Может быть, CreateIoCompletionPort терпит неудачу? –
@AlexFarber, спасибо, что указали его, но CreateIoCompletionPort возвращает действительный дескриптор. – Javier