Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Asignar valores al contenido de un record y mandar como puntero (https://www.clubdelphi.com/foros/showthread.php?t=94218)

Diego E. 07-10-2019 18:53:22

Asignar valores al contenido de un record y mandar como puntero
 
Hola, estoy conociendo los punteros y ciertamente no los termino de entender del todo, ya he leido varios artículos y me han ayudado a realizar cierta cantidad de código, sin embargo me topé con un obstáculo que no logro superar, espero puedan ayudarme.

El asunto es el siguiente, tengo la estructura:

Código Delphi [-]
TSSP_COMMAND = record
  Key: TSSP_FULL_KEY;
  BaudRate: LongInt;
  Timeout: LongInt;
  PortNumber: Byte;
  SSPAddress: Byte;
  RetryLevel: Byte;
  EncryptionStatus: Byte;
  CommandDataLength: Byte;
  CommandData: Array[0..255-1] of Byte;
  ResponseStatus: Byte;
  ResponseDataLength: Byte;
  ResponseData: Array[0..255-1] of Byte;
  IgnoreError: Byte;
end {SSP_COMMAND};

Misma que debo llenar sólo con los siguientes datos(por ahora):
Código Delphi [-]
command.BaudRate := 9600;
    command.Timeout := 1000;
    command.RetryLevel := 3;
    command.IgnoreError := 1;
    command.PortNumber := 20;
    command.SSPAddress := 0;

Una vez que se tienen dichos datos debo mandar dicha estructura como un puntero a una función que traje de una DLL:
Código Delphi [-]
TOpenPort = function (cmd: TSSP_COMMAND): Integer; stdcall; //Encabezado de la función de la DLL
ClosePort: TClosePort;
if OpenPort(command) = 0 then ShowMessage('No se pudo abrir el puerto'); //Esta es la linea del error

Lo que intento replicar en la linea del error es lo siguiente:
Código:

typedef struct{
        SSP_FULL_KEY Key;
        unsigned long BaudRate;
        unsigned long Timeout;
        unsigned char PortNumber;
        unsigned char SSPAddress;
        unsigned char RetryLevel;
        unsigned char EncryptionStatus;
        unsigned char CommandDataLength;
        unsigned char CommandData[255];
        unsigned char ResponseStatus;
        unsigned char ResponseDataLength;
        unsigned char ResponseData[255];
        unsigned char IgnoreError;
}SSP_COMMAND;

SSP_COMMAND* cmd;

if (OpenPort(cmd) == 0)
        {
                THREAD_UNLOCK
        return false;
        }

Intenté copiar el record sin éxito:
Código Delphi [-]
CopyMemory(@cmd, @command, sizeof(TSSP_COMMAND));

El punto de todo esto es que no funciona el OpenPort y yo supongo que es:
1.- No se está copiando bien el contenido de command a cmd(cmd es ^TSSP_COMMAND, por lo que tengo entendido que no se pueden leer ni modificar los datos más que copiando directamente de otro record)
2.- Da error por que no estoy mandando el puntero a la funcion OpenPort pero cuando se la intento poner en el encabezado me da error

Para no hacerlo más largo de lo que ya lo hice anexo todo lo necesario para poder probar el error(Hasta donde se pueda llegar sin el hardware del puerto). https://we.tl/t-Mk9IHv9I67

En conclusión, necesito tener algo parecido a ésto:
Código Delphi [-]
TOpenPort = function (cmd: ^TSSP_COMMAND): Integer; stdcall;

Y mandarle a OpenPort el puntero con las variables que les comenté asignadas en tiempo de ejecución, algo así o un equivalente:
Código Delphi [-]
cmd^.BaudRate := 9600;
    cmd^.Timeout := 1000;
    cmd^.RetryLevel := 3;
    cmd^.IgnoreError := 1;
    cmd^.PortNumber := 20;
    cmd^.SSPAddress := 0;
OpenPort(cmd^)


La franja horaria es GMT +2. Ahora son las 12:46:04.

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