#c #writefile
Вопрос:
Я использую файл записи для записи в файл, и иногда я получаю ошибку ERROR_INVALID_HANDLE. Я читал, что это может быть связано с тем, что значение ДЕСКРИПТОРА в Overlapped недопустимо. Но мне просто трудно это понять. Интересно, не выходит ли что-то за рамки? Буду признателен, если кто-нибудь сможет взглянуть. Я всегда могу добавить больше кода здесь
const LPOVERLAPPED lpOverlapped = GetOverlapped(true, hFile, ulBufSize, amp;ullFileOffset,volumeName); if (lpOverlapped == nullptr) { CloseHandle(hFile); return false; } if (!WriteFile(hFile,(const PVOID)(((UINT64) s_pMemoryBuffer[volumeName]) iBufferOffset),ulBufSize,amp;dwBytesWritten,lpOverlapped)) { DWORD errCode = GetLastError(); //Error here //Why do I get an error code 6 here every now and then }
Теперь это метод, который возвращает перекрывающуюся структуру
LPOVERLAPPED foo::GetOverlapped(bool useOverlappedIo, HANDLE hFile, UINT32 ulBufSize, UINT64* ullFileOffset,const std::stringamp; volumeName) { if (useOverlappedIo) { while (true) { int index = 0; while (index lt; cMaxOverlappedIOS) { if (!OverlappedInUse[volumeName][index]) { OverlappedInUse[volumeName][index] = true; LPOVERLAPPED overlapped = amp;(OverlappedArray[volumeName][index]); if (overlapped-gt;hEvent == nullptr) // Need Event { overlapped-gt;hEvent = CreateEvent( nullptr, TRUE, TRUE, nullptr); if (overlapped-gt;hEvent == nullptr) { printf("Error creating event (error code: %u)n", GetLastError()); return nullptr; } } overlapped-gt;Offset = (UINT32)(*ullFileOffset amp; 0xFFFFFFFF); // Low order 32 bits overlapped-gt;OffsetHigh = (UINT32)(*ullFileOffset gt;gt; 32); // High order 32 bits *ullFileOffset = ulBufSize; // Update pointer to next record return overlapped; } // Else Keep looking index ; } // None available, wait for at least one to free up if (WaitForPendingIOs(hFile, FALSE,volumeName) != ERROR_SUCCESS) { return nullptr; } } // Now start loop over again } else { return nullptr; } }
Вот как я инициализирую массив перед вызовом этого кода
for(auto vol : readVolumes) { OVERLAPPED* oarray = new OVERLAPPED[cMaxOverlappedIOS]; memset(oarray, 0, sizeof(oarray)); OverlappedArray[vol] = oarray; bool* boolinuse = new bool[cMaxOverlappedIOS]{false}; OverlappedInUse[vol] = boolinuse; s_pMemoryBuffer[vol] = nullptr; s_uDataBufferSize[vol] = 0; }
Есть какие-нибудь предложения о том, почему я получу эту ошибку ?
Комментарии:
1. @HansPassant Я добавил, как я создаю OverlappedArray, если это поможет
2. или это должно быть так
memset(oarray, 0, (size_t) cMaxOverlappedIOS * sizeof(OVERLAPPED))