驱动层说完了,接下来是应用层,对于应用层来说,需要使用CreateEvent打开通知事件,或者叫做事件对象,然后当有通知时,则直接使用ReadFile读取对应的缓冲区,当所有读取全部结束WaitForMultipleObjects等待结束即输出结果 。
#include <stdio.h>#include <Windows.h>int main(int argc, char *argv[]){ HANDLE hFile; char Buffer[3][32] = { 0 }; DWORD dwRet[3] = { 0 }; OVERLAPPED ol[3] = { 0 }; HANDLE hEvent[3] = { 0 }; // By:LyShark hFile = CreateFileA("\\\\.\\LySharkAsync", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL); if (INVALID_HANDLE_VALUE == hFile)return 0; // event用来通知请求完成 hEvent[0] = CreateEvent(NULL, TRUE, FALSE, NULL); ol[0].hEvent = hEvent[0]; hEvent[1] = CreateEvent(NULL, TRUE, FALSE, NULL); ol[1].hEvent = hEvent[1]; hEvent[2] = CreateEvent(NULL, TRUE, FALSE, NULL); ol[2].hEvent = hEvent[2]; // 读取事件内容到缓存 ReadFile(hFile, Buffer[0], 13, &dwRet[0], &ol[0]); ReadFile(hFile, Buffer[1], 13, &dwRet[1], &ol[1]); ReadFile(hFile, Buffer[2], 13, &dwRet[2], &ol[2]); // 等待三个事件执行完毕 WaitForMultipleObjects(3, hEvent, TRUE, INFINITE); // 输出结果 printf("缓存LyShark A: %s \n", Buffer[0]); printf("缓存LyShark B: %s \n", Buffer[1]); printf("缓存LyShark C: %s \n", Buffer[2]); CloseHandle(hFile); return 0;}这段代码最终运行效果如下:
文章插图
推荐阅读
- gRPC+Protocol Buffer Go微服务实战 - 用户服务开发
- WPF开发经验-实现自带触控键盘的TextBox
- 驱动通信:通过PIPE管道与内核层通信
- mac通过docker一键部署Jenkins
- 如何通过执行SQL为低代码项目提速?
- 驱动开发:通过ReadFile与内核层通信
- 三十六 Java开发学习----SpringBoot三种配置文件解析
- aardio + Python 可视化快速开发桌面程序,一键生成独立 EXE
- Windows esp-idf 安装
- aardio + PHP 可视化快速开发独立 EXE 桌面程序