Delphi 2012 XE2 x64平台实现HID设备操作

原创 2012年03月28日 19:19:45
Delphi 2012 XE2 开始支持x64位平台,现有的32位的DELPHI程序需要移植到x64平台下。下面是这次工作的记录。

直接把32位的工程编译成64位后,没有报错,但是执行SetupDiEnumDeviceInterfaces接口的时候总是返回false,使用GetLastError发现错误码是1784(提供给请求操作的用户缓冲区无效。 ),这个接口的C定义是

SetupDiEnumDeviceInterfaces(
__in HDEVINFO DeviceInfoSet,
__in_opt PSP_DEVINFO_DATA DeviceInfoData,
__in CONST GUID *InterfaceClassGuid,
__in DWORD MemberIndex,
__out PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData
);



检查了一下代码发现我在调用这个接口的时候只传入了DeviceInterfaceData这个参数,应该是这个参数x64和x86的平台下有差异。查看PSP_DEVINFO_DATA的定义。

typedef struct _SP_DEVICE_INTERFACE_DATA {
 DWORD cbSize;
 GUID  InterfaceClassGuid;
 DWORD Flags;
 ULONG_PTR Reserved;
} SP_DEVICE_INTERFACE_DATA, *PSP_DEVICE_INTERFACE_DATA;



按照接口的定义,在传入参数的时候需要先设置cbSize的大小。网上GOOGLE了一下XE2的64位和32位数据类型基本没有变化,但是VC是有变化的。
GUID应该是不管哪个平台下都应该是16bytes。
使用VS2005写了一个程序把DWORD,GUID,ULONG_PTR都sizeof了一下,确定这些数据类型在x64下的长度。

DWORD 4bytes
GUID  16bytes
ULONG_PTR 8bytes

所以SP_DEVICE_INTERFACE_DATA在64位下的大小应该是32bytes。之前在DELPHI程序中对SP_DEVICE_INTERFACE_DATA的定义是

SP_DEVICE_INTERFACE_DATA = record
 cbSize:Longword;
 InterfaceClassGuid:GUID;
 Flags:Longword;
 Reserved:Longword;
 end;



在XE2 x64平台下Longword仍然是4bytes,所以Reserved就应该用一个8字节的无符号数,去CSDN上问了一下用了UINT64代替。
修改为

SP_DEVICE_INTERFACE_DATA = record
 cbSize:Longword;
 InterfaceClassGuid:GUID;
 Flags:Longword;
 Reserved:UInt64;
 end;



重新编译了一下DELPHI工程,SetupDiEnumDeviceInterfaces接口执行正确,但是发现后面SetupDiGetDeviceInterfaceDetail接口执行又出现问题。

查了一下MSDN发现接口的第三个参数设置有需要注意的
If this parameter is specified, the caller must set DeviceInterfaceDetailData.cbSize to sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) before calling this function. The cbSize member always contains the size of the fixed part of the data structure, not a size reflecting the variable-length string at the end.
cbSize不能直接SizeOf整个长度,直接赋值8就OK了。

重新编译,就全部OK了。。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

HID-USB设备读写开发测试

http://bbs.csdn.net/topics/390691197 看过一个文章“Windows主机端与自定义USB HID设备通信详解",有这样一段文字。 1 、 ReadFile 的...
  • ghevinn
  • ghevinn
  • 2015年08月27日 13:58
  • 8793

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

HID读写过程

HID或USB的上、下位机之间相互读写时,并不是直接通信的,而是经过各自的buffer. 如下图所示:   上位机向下位机写数据: step1:      当点击Writ HID按键后,...

如何检测到USB热拔插

最近在写一个程序,需要检测到USB

HID设备打开

如何与HID设备通讯(二)

Android 应用性能优化(三) 多核下的多线程计算

针对多核的CPU可以有更好的计算方式

平面物体检测的主要算法流程

主要用于使用 features2d 和 calib3d 模块来检测场景中的已知平面物体。 步骤: 1、读入两幅图像; Mat img1 = imread(argv[1], CV_LOAD_IMA...

MQTT3.1.1delphi实现(xe7)跨平台

需要做一个APP控制设备的程序,思来想去放弃自己实现服务端,准备直接采用现成的MQTT服务端程序,自己只需要关心逻辑,传输的交个MQTT .网上能找到的delphi的版本是老外的基于一个三方网络库的,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi 2012 XE2 x64平台实现HID设备操作
举报原因:
原因补充:

(最多只允许输入30个字)