Estoy utilizando Delphi XE2 y estoy intentando actualizar nuestro usb comms dll a 64 bit. Estamos usando las unidades JVCL SetupAPI y Hid. Todo funciona perfectamente usando un compilador de 32 bits y puedo ver mi dispositivo HID adjunto. Cambio a 64 bits y ya no puedo ver ninguno de los dispositivos HID que sé que están conectados.Enumeración de dispositivos USB HID que utilizan SetupAPI en la aplicación de 64 bits
Me he encontrado con personas que mencionan la necesidad de cambiar el tamaño de algunas estructuras de datos de manera diferente para 64 bits (ver https://forums.embarcadero.com/thread.jspa?messageID=408473#408473) y esto ha ayudado, pero ahora estoy oficialmente perplejo.
Actualmente mi código devuelve 0 bytes leídos de la función SetupDiGetDeviceInterfaceDetail. El SizeOf() comentado funcionaba para 32 bits pero no para 64 bits.
Cualquier ayuda sería muy apreciada.
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, nil, 0, 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, @TmpDeviceInterfaceData, TmpFunctionClassDeviceData, TmpBytesReturned, TmpBytesReturned, @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 , 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;
> por qué el DevicePath debe copiarse de forma explícita como ms dice aquí: http://msdn.microsoft.com/en-us/library/windows/hardware/ff552343%28v=vs.85%29 .aspx > DevicePath > Una cadena con terminación NULL que contiene la ruta de la interfaz del dispositivo. Esta ruta se puede pasar a las funciones de Win32 como CreateFile. szDevicePath: = PChar (@ TmpFunctionClassDeviceData.DevicePath [0]); usa ese valor para pasar a CreateFile. –