1

出于某种原因,我的回调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);
    }
}
4

2 回答 2

5

我忘了FILE_FLAG_OVERLAPPED指定CreateFile

于 2013-05-23T19:00:31.813 回答
0

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

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

于 2013-05-23T19:15:36.163 回答