Всем привет!
В MSDN написано, что WriteFileEx работает только в асинхронном режиме, у меня же она работает почему-то в синхронном. Накатал примерчик:
void ShowMsg(char* Msg){
MessageBoxA(NULL, Msg, NULL, NULL);
};
void ShowMsg(char* Format, long Param1){
char* Msg = new char[strlen(Format) + 1000];
sprintf(Msg, Format, Param1);
ShowMsg(Msg);
delete[] Msg;
};
VOID CALLBACK FileIOCompletionRoutine(
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransfered,
LPOVERLAPPED lpOverlapped
){
ShowMsg("IO completed with error code %d", dwErrorCode);
}
void Test_WriteFileEx(char* FileName){
HANDLE HFile = CreateFileA(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
if(HFile == INVALID_HANDLE_VALUE) {
ShowMsg("Cannot open file. CreateFile: %d", GetLastError());
}
else{
char* Buffer = new char[500000];
OVERLAPPED Overlapped;
ZeroMemory(&Overlapped, sizeof(Overlapped));
Overlapped.Offset = GetFileSize(HFile, &Overlapped.OffsetHigh);
if(Overlapped.Offset == INVALID_FILE_SIZE && GetLastError() != 0){
ShowMsg("GetFileSize: %d", GetLastError());
}
else{
if(WriteFileEx(HFile, Buffer, 500000, &Overlapped, &FileIOCompletionRoutine) == 0){
ShowMsg("WriteFileEx: %d", GetLastError());
}
else{
DWORD Res = SleepEx(15000, TRUE);
ShowMsg("WriteFileEx: success");
switch(Res){
case 0:
ShowMsg("SleepEx: Timeout");
break;
case WAIT_IO_COMPLETION:
ShowMsg("SleepEx: IO completion");
break;
default:
ASSERT(false);
}
};
};
CloseHandle(Overlapped.hEvent);
CloseHandle(HFile);
delete[] Buffer;
};
}
Передаю в качестве FileName файл на дискетке. Сначала всё очень долго пыхтит, а затем последовательно появляются сообщения:
IO completed with error code 0
WriteFileEx: success
SleepEx: IO completion
что означает, что FileIOCompletionRoutine вызывается внутри WriteFileEx