Delphi TJvHidDeviceController“;“设备路径”;“始终显示”\&引用;

Delphi TJvHidDeviceController“;“设备路径”;“始终显示”\&引用;,delphi,delphi-2010,hid,Delphi,Delphi 2010,Hid,我正在使用TJvHidDeviceController类检索HID设备信息。我插入了两个HID设备,但我正在尝试将SP_DEVICE_INTERFACE_DETAIL_DATA_结构的“DevicePath”转换为一个始终将设备路径设置为“\”的结构。所以我无法打开CreateFile函数。请帮我解决这个问题。我的操作系统是win7。 谢谢大家。这是猜测 我能想到的一件事是: TJvHidDeviceController调用Windows API调用时不使用a或W后缀。使用的结构是SP_设备_接

我正在使用TJvHidDeviceController类检索HID设备信息。我插入了两个HID设备,但我正在尝试将SP_DEVICE_INTERFACE_DETAIL_DATA_结构的“DevicePath”转换为一个始终将设备路径设置为“\”的结构。所以我无法打开CreateFile函数。请帮我解决这个问题。我的操作系统是win7。 谢谢大家。

这是猜测

我能想到的一件事是:

TJvHidDeviceController调用Windows API调用时不使用a或W后缀。使用的结构是SP_设备_接口_细节_数据_A,ANSI版本。现在,如果您使用Delphi 2009或更高版本,例程将期望SP_设备_接口_细节_数据_W。大小相同,因此一切看起来都正常。但是存储的字符串将是USC2编码的(WideChars),而不是ANSI编码的->因此在每个ANSI字符之后将有一个空字节。TJvHidDeviceController可能使用StrPas之类的函数将字符数组转换回pascal字符串,因此,您只能看到第一个字符

检查: 在填充结构的函数调用之后设置一个断点,并使用CPU窗口将内容视为内存转储。如果每隔一个字节看到一个ANSI字符,而在这两个字节之间看到的是空字节,则可以确认上述情况是否属实

解决方案:

  • 检查调用是否使用宽变量,并相应地更改结构
  • 检查呼叫是否使用宽变量,并改用A变量。这可能是最简单的选择

  • 如果以完全管理员权限运行应用程序,问题是否仍然存在?您是否使用了更新版本的Delphi,其中Char等于WideChar而不是AnsiChar?哪个Delphi版本?哪个Windows版本?@Jeroen:在另一个问题中,用户602714说:(我使用的是Delphi 2010)这不仅仅是猜测。他没有说他是在使用unicode Delphi(2009+)还是一些旧的Ansi Delphi版本。@Warren:这只是猜测的一部分;-)。大家好,是的,我正在使用Delphi2010。我把后缀“A”改为“W”。现在它可以正常工作了。现在获取所有HID设备信息。非常感谢。这对我帮助很大。再次感谢……:)