LPOVERLAPPED_COMPLETION_ROUTINE несовместимо с функцией

winapi c++-cli writefile

416 просмотра

1 ответ

303 Репутация автора

Я хочу асинхронно записывать данные в файл, используя 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 Источник Размещён: 06.01.2015 10:54

Ответы (1)


4 плюса

538056 Репутация автора

Решение

Вы должны начать с прочтения документации внимательно. Эта часть имеет особое значение:

Структура данных OVERLAPPED должна оставаться действительной в течение всей операции записи. Это не должна быть переменная, которая может выходить из области видимости, пока операция записи ожидает завершения.

Вы не выполняете это требование, и вам нужно срочно заняться этим вопросом.

Что касается ошибки компилятора, это достаточно просто. Ваш обратный звонок не соответствует требованиям. Снова сверьтесь с документацией, где ее подпись имеет вид:

VOID CALLBACK FileIOCompletionRoutine(
  _In_     DWORD dwErrorCode,
  _In_     DWORD dwNumberOfBytesTransfered,
  _Inout_  LPOVERLAPPED lpOverlapped
);

Вы пропустили, CALLBACKкоторый определяет соглашение о вызовах.

Автор: David Heffernan Размещён: 06.01.2015 11:00
Вопросы из категории :
32x32