2013-05-23 2 views
1

По какой-то причине мой обратный вызов не получает адрес правильной структуры OVERLAPPED после вызова ReadFileEx. Что может вызвать это?Почему обратный вызов, предоставленный ReadFileEx(), не получает правильную структуру OVERLAPPED?

Update - пример:

#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); 
    } 
} 

ответ

0

Кроме того, вполне возможно, что право собственности на оригинальную структуру OVL не было отказано при настройке обратного вызова и поэтому перезаписано между настройкой и обратным вызовом.

Возможно, что неопытный разработчик мог бы выделить его в стеке потока, настроив его - не хороший ход :)

Смежные вопросы