LPOVERLAPPED_COMPLETION_ROUTINE 与函数不兼容
LPOVERLAPPED_COMPLETION_ROUTINE is incompatible with function
我想使用 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);
}
您应该先仔细阅读 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.
您不符合该要求,您需要紧急解决该问题。
至于编译错误,很简单。您的回调不符合要求。再次查阅 documentation,其签名为:
VOID CALLBACK FileIOCompletionRoutine(
_In_ DWORD dwErrorCode,
_In_ DWORD dwNumberOfBytesTransfered,
_Inout_ LPOVERLAPPED lpOverlapped
);
您省略了指定调用约定的 CALLBACK
。
我想使用 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);
}
您应该先仔细阅读 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.
您不符合该要求,您需要紧急解决该问题。
至于编译错误,很简单。您的回调不符合要求。再次查阅 documentation,其签名为:
VOID CALLBACK FileIOCompletionRoutine(
_In_ DWORD dwErrorCode,
_In_ DWORD dwNumberOfBytesTransfered,
_Inout_ LPOVERLAPPED lpOverlapped
);
您省略了指定调用约定的 CALLBACK
。