LPOVERLAPPED_COMPLETION_ROUTINE несовместимо с функцией
416 просмотра
1 ответ
Я хочу асинхронно записывать данные в файл, используя WriteFileEx из winapi , но у меня проблема с обратным вызовом.
Я получаю следующее сообщение об ошибке: аргумент типа "void (*) (DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)" несовместим с параметром типа "LPOVERLAPPED_COMPLETION_ROUTINE"
Что я делаю неправильно?
Вот код:
// Callback
void onWriteComplete(
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransfered,
LPOVERLAPPED lpOverlapped) {
return;
}
BOOL writeToOutputFile(String ^outFileName, List<String ^> ^fileNames) {
HANDLE hFile;
char DataBuffer[] = "This is some test data to write to the file.";
DWORD dwBytesToWrite = (DWORD) strlen(DataBuffer);
DWORD dwBytesWritten = 0;
BOOL bErrorFlag = FALSE;
pin_ptr<const wchar_t> wFileName = PtrToStringChars(outFileName);
hFile = CreateFile(
wFileName, // name of the write
GENERIC_WRITE, // open for writing
0, // do not share
NULL, // default security
CREATE_NEW, // create new file only
FILE_FLAG_OVERLAPPED,
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE) {
return FALSE;
}
OVERLAPPED oOverlap;
bErrorFlag = WriteFileEx(
hFile, // open file handle
DataBuffer, // start of data to write
dwBytesToWrite, // number of bytes to write
&oOverlap, // overlapped structure
onWriteComplete),
CloseHandle(hFile);
}
Автор: Mike_Device
Источник
Размещён: 12.11.2019 09:40
Ответы (1)
4 плюса
Вы должны начать с прочтения документации внимательно. Эта часть имеет особое значение:
Структура данных OVERLAPPED должна оставаться действительной в течение всей операции записи. Это не должна быть переменная, которая может выходить из области видимости, пока операция записи ожидает завершения.
Вы не выполняете это требование, и вам нужно срочно заняться этим вопросом.
Что касается ошибки компилятора, это достаточно просто. Ваш обратный звонок не соответствует требованиям. Снова сверьтесь с документацией, где ее подпись имеет вид:
VOID CALLBACK FileIOCompletionRoutine(
_In_ DWORD dwErrorCode,
_In_ DWORD dwNumberOfBytesTransfered,
_Inout_ LPOVERLAPPED lpOverlapped
);
Вы пропустили, CALLBACK
который определяет соглашение о вызовах.
Вопросы из категории :
- winapi Какой самый простой способ для анализа файла INI в C ++?
- winapi Как преобразовать std :: string в LPCWSTR в C ++ (Unicode)
- winapi Как настроить OpenFileDialog для выбора папок?
- winapi Как прочитать значение из реестра Windows
- winapi Как мне вызвать :: CreateProcess в C ++ для запуска исполняемого файла Windows?
- winapi Диалоги Windows API без использования файлов ресурсов
- c++-cli Что такое gcnew?
- c++-cli Что означает каретка ('^') в C ++ / CLI?
- c++-cli Вызов C # кода из C ++
- c++-cli Документирование кода библиотеки C ++ / CLI для использования с c # - лучшие инструменты и практики?
- c++-cli C ++ / CLI: публичная структура ссылок генерирует C2011: переопределение типа 'class'
- c++-cli Как я могу смешать Concurrency Runtime с кодом .NET?
- writefile LPOVERLAPPED_COMPLETION_ROUTINE несовместимо с функцией
- writefile Чтение данных из текстового файла и создание объекта
- writefile Проблемы точности с dlmwrite / dlmread
- writefile Запись в файл в Python
- writefile Запишите граф в файл в виде списка смежности [упоминая всех соседей каждого узла в каждой строке]
- writefile Java: читать 2 файла и сравнивать построчно