Ver Mensaje Individual
  #2  
Antiguo 08-01-2025
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Reputación: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
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; // Primer byte
      (PByte(NativeUInt(pB) + 1))^ := Mode;  // Segundo byte
      (PByte(NativeUInt(pB) + 2))^ := Relay; // Tercer byte

      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:
  1. NativeUInt: Se usa para convertir el puntero pB en un entero sin signo que permite realizar la aritmética de punteros de manera segura.
  2. 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.
  3. 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.
Responder Con Cita