关于ReadFile函数错误:代码6,ERROR_INVALID_HANDLE

    最近想用API函数写一个串口异步读写的测试代码,翻了很多资料,把别人的代码简单加工一下。结果明明是跟别人代码一致,执行后却啥也收不到,开始查找问题,从初始化,设置,串口连接……全都改成和别人代码一致,还是不行!一步步看,明明使用ClearCommError捕捉到缓冲区有数了,ReadFile函数却一直不能正常执行,GetLastError后代码为6,查MSDN,ERROR_INVALID_HANDLE。

    纳闷了!

    环境又不能上网,憋死个人……终于在能上网的时候,赶紧找~

    仅仅是ReadFile最后一个参数由于定义了局部变量而没有进行初始化!

    恨!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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 操作的结果。在这个示例中,我们手动调用了回调函数,以便在控制台输出读取的字节数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值