单位网站怎么制作,沈阳网站关键词排名,辽宁网站建站系统哪家好,比较好的室内设计网站应用程序和驱动程序的通信过程是#xff1a;应用程序使用CreateFile函数打开设备#xff0c;然后用DeviceIoControl与驱动程序进行通信#xff0c;包括读和写两种操作。还可以用ReadFile读数据用WriteFile写数据。操作完毕时用CloseHandle关闭设备。我们比较常用的就是用Dev… 应用程序和驱动程序的通信过程是应用程序使用CreateFile函数打开设备然后用DeviceIoControl与驱动程序进行通信包括读和写两种操作。还可以用ReadFile读数据用WriteFile写数据。操作完毕时用CloseHandle关闭设备。我们比较常用的就是用DeviceIoControl对设备进行读写操作。先看看DeviceIoControl是怎么定义的
BOOL DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped
); Parameters参数 hDevice CreateFile返回的设备句柄[in] Handle to the device that is to perform the operation. To obtain a device handle, call the CreateFile function.dwIoControlCode 应用程序调用驱动程序的控制命令就是IOCTL_XXX IOCTLs [in] IOCTL for the operation. This value identifies the specific operation to perform and the type of device on which to perform the operation. There are no specific values defined for the dwIoControlCode parameter. However, you can define custom IOCTL_XXX IOCTLs with the CTL_CODEmacro. You can then advertise these IOCTLs and an application can use these IOCTLs with DeviceIoControl to perform the driver-specific functions.lpInBuffer 应用程序传递给驱动程序的数据缓冲区地址[in] Long pointer to a buffer that contains the data required to perform the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not require input data.nInBufferSize 应用程序传递给驱动程序的数据缓冲区大小字节数[in] Size, in bytes, of the buffer pointed to by lpInBuffer.lpOutBuffer 驱动程序返回给应用程序的数据缓冲区地址[out] Long pointer to a buffer that receives the output data for the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not produce output data.nOutBufferSize 驱动程序返回给应用程序的数据缓冲区大小字节数[out] Size, in bytes, of the buffer pointed to by lpOutBuffer.lpBytesReturned 驱动程序实际返回给应用程序的数据字节数地址[out] Long pointer to a variable that receives the size, in bytes, of the data stored in lpOutBuffer. The DeviceIoControl function may unnecessarily use this parameter. For example, if an operation does not produce data for lpOutBuffer and lpOutBuffer is NULL, the value of lpBytesReturned is meaningless.lpOverlapped 重叠操作结构[in] Ignored; set to NULL.Return Values返回值 Nonzero indicates success. Zero indicates failure. To obtain extended error information, call the GetLastError function. 非0成功0失败 具体使用我们看看列子 1向设备传递数据我们定义一个函数来实现 bool CDeviceOperDlg::SendKeyData(HANDLE handle, BYTE *bData, int iSize) { ULONG nOutput; BYTE bTemp[512]; //将数据放置到发送数组 memset(bTemp,0,sizeof(bTemp)); memcpy(bTemp,bData[0],iSize); //向设备发送 if (!DeviceIoControl(handle, ATST2004_IOCTL_WRITE, //根据具体的设备有相关的定义 bTemp, //向设备传递的数据地址 iSize, //数据大小字节数 NULL, //没有返回的数据置为NULL 0, //没有返回的数据置为0 nOutput, NULL) ) { return false; } return true; } 2从设备读取数据 bool CDeviceOperDlg::ReviceKeyData(HANDLE handle, BYTE *bData, int iSize) { ULONG nOutput; BYTE bTemp[512]; //数组清零 memset(bTemp,0,sizeof(bTemp)); //向设备发送 if (!DeviceIoControl(handle, ATST2004_IOCTL_READ, //根据具体的设备有相关的定义 NULL, //没有向设备传递的数据置为NULL 0, //没有向设备传递的数据置为NULL bTemp, //读取设备的数据返回地址 iSize, //读取数据的字节数 nOutput, NULL) ) { return false; } //放置到公用数组 memcpy(bData[0],bTemp[0],iSize); return true; }