ReadFile 如何使用回调函数
时间: 2023-10-27 07:06:58 浏览: 90
ReadFile 函数是 Windows API 中用于读取文件的函数,它的原型如下:
```c++
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
```
其中,参数 lpOverlapped 是一个指向 OVERLAPPED 结构体的指针,它可以用于异步 I/O 操作。如果你需要在异步 I/O 操作完成后执行特定的操作,就可以使用回调函数。
回调函数需要满足以下要求:
1. 回调函数的返回值为 void。
2. 回调函数的参数列表中应包含 DWORD 值,它表示异步 I/O 操作的结果。
3. 回调函数的参数列表中应包含 DWORD_PTR 值,它表示与异步 I/O 操作相关联的数据。
下面是一个使用回调函数的 ReadFile 示例:
```c++
#include <Windows.h>
#include <iostream>
void CALLBACK ReadCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) {
std::cout << "Read " << dwNumberOfBytesTransfered << " bytes from file." << std::endl;
}
int main() {
HANDLE hFile = CreateFile(L"test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to open file." << std::endl;
return 1;
}
char buffer[256];
OVERLAPPED overlapped = { 0 };
overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
BOOL result = ReadFile(hFile, buffer, sizeof(buffer), NULL, &overlapped);
if (!result && GetLastError() == ERROR_IO_PENDING) {
std::cout << "Asynchronous I/O operation is pending..." << std::endl;
}
result = GetOverlappedResult(hFile, &overlapped, NULL, TRUE);
if (!result) {
std::cerr << "Failed to read file." << std::endl;
return 1;
}
ReadCompletionRoutine(0, overlapped.InternalHigh, &overlapped);
CloseHandle(hFile);
CloseHandle(overlapped.hEvent);
return 0;
}
```
在这个示例中,我们创建了一个名为 ReadCompletionRoutine 的回调函数,并将它作为参数传递给了 ReadFile 函数。当异步 I/O 操作完成时,系统会自动调用这个回调函数,并传递异步 I/O 操作的结果。在这个示例中,我们手动调用了回调函数,以便在控制台输出读取的字节数。
阅读全文