2015-01-06 2 views
0
내가 비동기 WINAPI에서 WriteFileEx 을 사용하여 파일에 데이터를 기록 할

와 호환되지 않습니다,하지만 난 콜백에 문제가 있습니다.LPOVERLAPPED_COMPLETION_ROUTINE 기능

내가 갖는 후속 오류 : 유형의 인수 "무효가 (*) (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); 
} 

답변

3

당신은 신중하게 documentation을 읽는 것으로 시작한다 : 여기

는 코드입니다. 이 부분은 특히 수입이다 :

The OVERLAPPED data structure must remain valid for the duration of the write operation. It should not be a variable that can go out of scope while the write operation is pending completion.

당신은 그 요건을 충족하지 않는, 당신이 긴급하게 그 문제를 해결해야합니다.

컴파일러 오류에 대해서는 간단합니다. 콜백이 요구 사항을 충족하지 않습니다. 당신은 호출 규칙을 지정 CALLBACK을 생략 한

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

: 그 서명은 다음과 같이 주어진다 다시 documentation를 참조하십시오.

+0

고마워요! 이제 작동 중입니다 –

+0

그건 그렇고, 다시 도와 주실 수 있습니까? 여기서 콜백은 전혀 호출되지 않습니다. 기다리고 있지만 아무 일도 일어나지 않습니다. –

+0

문서를 읽어야합니다. 반환 값을 확인하지 않습니다. 또는 GetLastError를 호출합니다. –