我遇到有人提到需要以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设备所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)