Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #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.670
Poder: 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
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error paso de fecha por parametro en ADO javi.donvito SQL 16 17-12-2008 21:18:24
violacion de direccion de memoria anubis Varios 3 09-05-2007 00:48:38
Obtener DirecciÓn De Memoria Juan Carlos API de Windows 3 20-04-2005 14:38:42
Direccion de memoria de una funcion camambrini Varios 0 30-07-2004 18:20:05
Leer direccion de memoria brandolin Varios 8 25-09-2003 16:29:22


La franja horaria es GMT +2. Ahora son las 19:21:07.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi