Как предоставить подпрограмме завершения ReadFileEx () контекстную информацию? - PullRequest
2 голосов
/ 02 июня 2009

Win32 ReadFileEx определяется как:

BOOL WINAPI ReadFileEx(
  __in       HANDLE hFile,
  __out_opt  LPVOID lpBuffer,
  __in       DWORD nNumberOfBytesToRead,
  __inout    LPOVERLAPPED lpOverlapped,
  __in_opt   LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

Я пытаюсь выяснить, как сделать так, чтобы подпрограмма завершения (последний аргумент) вызывала динамический указатель на функцию после завершения операции. Кажется, нет способа передать пользовательские данные. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 02 июня 2009

Функция lpOverlapped, переданная в ReadFileEx, передается в функцию lpCompletionRoutine.

Вы можете встроить lpOverlapped в свою собственную структуру, а затем использовать ее, чтобы найти указатель на ваш контекст:

struct ReadFileExContext
{ 
    OVERLAPPED _Overlapped; 
    LPVOID MyContext; 
}; 

Затем в функции обратного вызова вы преобразуете LPOVERLAPPED в ReadFileContext, и все готово.

2 голосов
/ 08 октября 2012

Выполнял сегодня некоторые операции ввода-вывода и заметил, что в функциях чтения и записи WSA и File указано, что hEvent структуры OVERLAPPED не используется, если вы используете подпрограмму завершения, например, от ReadFileEx

Функция ReadFileEx игнорирует член hEvent структуры OVERLAPPED. Приложение может свободно использовать этот элемент в своих целях в контексте вызова ReadFileEx. ReadFileEx сигнализирует о завершении своей операции чтения, вызывая или ставя в очередь вызов подпрограммы завершения, на которую указывает lpCompletionRoutine, поэтому ему не нужен дескриптор события.

0 голосов
/ 02 июня 2009

Вы можете использовать Thread Local Storage ... Просто создайте слот и сохраните указатель на любые данные, которые вы хотите. Поскольку lpCompletionRoutine запускается в вызывающем потоке, все будет в порядке.

...