Почему WriteFileEx работает синхронно?
От: Аноним  
Дата: 31.01.08 16:43
Оценка:
Всем привет!
В 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.