为什么给ReadFileEx()的回调没有收到正确的OVERLAPPED结构?

时间:2013-05-23 19:00:32

标签: c winapi visual-c++ file-io overlapped-io

出于某种原因,我的回调在调用OVERLAPPED后没有收到正确ReadFileEx结构的地址。是什么导致这种情况?

更新 - 示例:

#include <stdio.h>
#include <Windows.h>

void __stdcall completion_routine(
    unsigned long dwErrorCode,
    unsigned long dwNumberOfBytesTransfered,
    OVERLAPPED *lpOverlapped)
{
    printf("Overlapped = %p\n", lpOverlapped);
}

int _tmain(int argc, LPTSTR argv[])
{
    HANDLE hvolume = CreateFile(
        _T("C:\\Windows\\Notepad.exe"), FILE_READ_DATA,
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
        NULL, OPEN_EXISTING, 0, NULL);
    char tempbuf[512];
    OVERLAPPED tempoverlapped = { };
    printf("%p\n", &tempoverlapped);
    if (ReadFileEx(hvolume, tempbuf, sizeof(tempbuf),
                   &tempoverlapped, &completion_routine)
        && GetLastError() == ERROR_SUCCESS)
    {
        SleepEx(INFINITE, TRUE);
    }
}

2 个答案:

答案 0 :(得分:4)

我忘记将FILE_FLAG_OVERLAPPED指定给CreateFile

答案 1 :(得分:0)

此外,在设置回调时,原始OVL结构的所有权也很可能没有放弃,因此在设置和回调之间被覆盖。

甚至可能没有经验的开发人员可能会在设置它的线程的堆栈上分配它 - 这不是一个好的举动:)