2011-02-09 86 views
0

我正在使用TJvHidDeviceController类来检索HID设备信息。我插入了两个HID设备,但我试图创建SP_DEVICE_INTERFACE_DETAIL_DATA_A结构的“DevicePath”,并始终将设备路径设置为“\”。所以我不能打开CreateFile函数。请帮我解决这个问题。我的操作系统win7。 谢谢大家。TJvHidDeviceController“DevicePath”始终显示“”

+1

如果以完全管理权限运行应用程序,问题是否仍然存在?您是否使用过较新版本的Delphi,其中Char等于WideChar而不是AnsiChar? –

+0

哪个Delphi版本?哪个Windows版本? –

+0

@Jeroen:在另一个问题user602714说:http://stackoverflow.com/questions/4895179/how-to-programmatically-change-tablet-pc-orientation(我使用Delphi 2010) –

回答

2

这是猜测!

有一件事我能想到的是:

TJvHidDeviceController调用Windows API调用不使用一个或W后缀。使用的结构是ANSI版本SP_DEVICE_INTERFACE_DETAIL_DATA_A。现在,如果您使用的是Delphi 2009或更高版本,则该例程将需要SP_DEVICE_INTERFACE_DETAIL_DATA_W。大小是一样的,所以一切都看起来不错。但是存储的字符串将是USC2编码(WideChars)而不是ANSI编码 - >因此,在每个ANSI字符后都会有一个空字节。 TJvHidDeviceController可能会使用类似StrPas的函数将字符数组转换回pascal字符串,因此您只能看到第一个字符。

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

解决方案:

  1. 检查,如果呼叫是使用广泛的变异,并相应地改变结构。
  2. 检查呼叫是否使用宽变体并改为使用A变体。这可能是最简单的选择。
+0

这不仅仅是猜测。他没有说过他是使用unicode Delphi(2009+)还是使用一些较老的Ansi delphi版本。 –

+0

@Warren:这只是猜测的一部分;-)。 –

+0

大家好,我正在使用Delphi2010。我将后缀“A”更改为“W”。现在它的工作正常。现在获取所有HID设备信息。非常感谢。它帮助我很多。再次感谢...:) –