El error ocurre porque en las versiones más recientes de Delphi, los punteros ya no se pueden manipular aritméticamente de forma directa, como en versiones más antiguas. Esto está relacionado con los cambios en la administración de punteros y tipos de datos en el compilador.
Para resolver el problema, necesitas convertir el puntero a un tipo entero adecuado para realizar la aritmética, y luego volver a convertirlo a un puntero. Aquí tienes una forma de hacerlo:
Código Delphi
[-]function THidRlyForm.SendCmd(Relay, Mode: Byte): String;
var
pB: PByte;
Dev: TJvHidDevice;
Status: Boolean;
begin
Dev := TJvHidDevice(lbBoards.Items.Objects[lbBoards.ItemIndex]);
try
pB := AllocMem(10);
try
pB^ := 0; (PByte(NativeUInt(pB) + 1))^ := Mode; (PByte(NativeUInt(pB) + 2))^ := Relay;
Status := Dev.SetFeature(pB^, 9);
if Status then
Result := Format('%2.2x %2.2x %2.2x', [pB^, (PByte(NativeUInt(pB) + 1))^, (PByte(NativeUInt(pB) + 2))^])
else
Result := 'Command not sent';
Status := Dev.GetFeature(pB^, 9);
if Status then
Result := Format('%s - %2.2x', [Result, (PByte(NativeUInt(pB) + 8))^]);
finally
FreeMem(pB);
end;
end;
end;
Cita:
Cambios explicados:
- NativeUInt: Se usa para convertir el puntero pB en un entero sin signo que permite realizar la aritmética de punteros de manera segura.
- PByte: Se utiliza para volver a convertir el entero a un puntero de tipo PByte, de forma que se pueda acceder al valor de la dirección de memoria correcta.
- Manejo de memoria: La asignación y liberación de memoria (AllocMem y FreeMem) permanece igual.
Detalles adicionales:
- La función NativeUInt es compatible con Delphi moderno y asegura que la manipulación de punteros sea válida tanto en plataformas de 32 bits como de 64 bits.
- Asegúrate de que Dev.SetFeature y Dev.GetFeature manejen correctamente los datos, especialmente si dependen de buffers de longitud fija.
|
Lo he copiado del chatgpt.