delphi – 在64位应用程序中使用SetupAPI枚举USB HID设备

delphi – 在64位应用程序中使用SetupAPI枚举USB HID设备,第1张

概述我正在使用Delphi XE2并尝试将我们的usb通信dll升级到64位.我们正在使用JVCL SetupAPI和Hid单元.所有工作完全使用32位编译器,可以看到我附加的HID设备.我切换到64位,我再也看不到任何我知道的HID设备了. 我遇到有人提到需要以64位不同的方式调整某些数据结构的大小(见https://forums.embarcadero.com/thread.jspa?messag 我正在使用Delphi XE2并尝试将我们的usb通信dll升级到64位.我们正在使用JVCL SetupAPI和HID单元.所有工作完全使用32位编译器,可以看到我附加的HID设备.我切换到64位,我再也看不到任何我知道的HID设备了.

我遇到有人提到需要以64位不同的方式调整某些数据结构的大小(见https://forums.embarcadero.com/thread.jspa?messageID=408473#408473),这有所帮助,但我现在正式感到难过.

目前我的代码返回从SetupDiGetDeviceInterfaceDetail函数读取的0字节.注释掉的SizeOf()适用于32位但不适用于64位.

任何帮助将非常感激.

repeat  TmpDeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);  TmpDeviceInterfaceData.cbSize := 32;  // SizeOf(TmpDeviceInterfaceData);  TmpSuccess := SetupDIEnumDeviceInterfaces(TmpDevInfo,nil,TmpDevHIDGuID,TmpDevn,TmpDeviceInterfaceData);  if TmpSuccess then  begin    TmpDevData.cbSize := 32; //SizeOf(TmpDevData);    showmessage(inttostr(tmpdevdata.cbsize));    TmpBytesReturned := 0;    SetupDiGetDeviceInterfaceDetail(TmpDevInfo,@TmpDeviceInterfaceData,TmpBytesReturned,@TmpDevData);    showmessage('bytes returned = ' + inttostr(TmpBytesReturned));    if (TmpBytesReturned <> 0) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then    begin      // showmessage('hello');      TmpFunctionClassDeviceData := Allocmem(TmpBytesReturned);      TmpFunctionClassDeviceData.cbSize := sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);      TmpFunctionClassDeviceData.cbSize := 8;      // showmessage(inttostr(TmpFunctionClassDeviceData.cbSize));      if SetupDiGetDeviceInterfaceDetail(TmpDevInfo,TmpFunctionClassDeviceData,@TmpDevData) then      begin        // showmessage('here');        try          begin          //try to obtain PID and VID information about the HID devices          TmpDeviceHandle := Createfile(@TmpFunctionClassDeviceData.DevicePath,GENERIC_READ OR GENERIC_WRITE,file_SHARE_READ OR file_SHARE_WRITE,NIL,OPEN_EXISTING,0);          TmpAttributes.Size := Sizeof(TmpAttributes);          HIDD_GetAttributes(TmpDeviceHandle,TmpAttributes);          If (vID = TmpAttributes.vendorID) then          begin            PIDListStr := PIDListStr + Inttostr(TmpAttributes.ProductID) + ',';          end ;          if TmpDeviceHandle <> INVALID_HANDLE_VALUE then           begin            CloseHandle(TmpDeviceHandle);            TmpAttributes.ProductID := 0;            TmpAttributes.vendorID := 0;           end;          TmpDeviceHandle := INVALID_HANDLE_VALUE;          end        except          // ignore device if unreadable        end;        Inc(TmpDevn);      end    else      showmessage('error in SetupDiGetDeviceInterfaceDetails');      FreeMem(TmpFunctionClassDeviceData);    end;  end;until not TmpSuccess;
解决方法 现在更改是在JVCL中,请使用最新的SVN内容.

基本上,需要修复SetupAPI,以便它在x64中使用“填充”进行对齐.

这已经过测试,在这里运行良好.

总结

以上是内存溢出为你收集整理的delphi – 在64位应用程序中使用SetupAPI枚举USB HID设备全部内容,希望文章能够帮你解决delphi – 在64位应用程序中使用SetupAPI枚举USB HID设备所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1271467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存