![]() |
Mi función está leyendo mal los parámetros
Hola, nuevamente ando por aquí, sigo avanzando pero cada vez encuentro más y más obstáculos, a ver que tal está éste:
Traigo de una DLL esto y parece que todo va bien:
Luego lo mando llamar así:
Lo que yo le envio es:
Total que no no manda error pero me sale el mensaje: Titulo: COM0 Mensaje: Unable to open this port Alguna idea de ¿Por qué está tratando de abrir el puerto 0 cuando yo le estoy diciendo que abra el 20($14)? ¿Será que la estoy regando en algún puntero o algo? |
¿Te falta rellenar parámetros del Command?
Otra opción es probar con enteros en lugar de hexadecimal. |
Hola,
Por ahí hay una documentación de la estructura que pide esa DLL. Dice así: Código:
struct SSP_COMMAND
De manera que todos esos tipos de dato están mal, parece que hubiera copiado y pegado de un código Java. Supongo que debe definir si estará usando Int32 ó Int64, y los arrays deben ser de Char (o usar un alias apropiado dentro de Delphi). Pero ya está en sus manos, usando el SDK y su propio entorno de trabajo. - |
Cita:
Yo mismo le pasé esa estructura. Porque en "otro sitio" encontré algo como esto: Código:
Public Type SSP_COMMAND En el mismo ZIP (que hay en el link) que ha enviado Diego, hay varias versiones de la misma DLL, cada una con cabeceras distintas. Y sobre ninguna de ellas he encontrado documentación. Por lo tanto es como dar palos de ciego. |
Cita:
|
Cita:
- |
Quizás ya lo hayas resuelto, pero ¿Has probado a usar packed record en vez de record?
|
Cita:
|
Quizá sea útil ponerlos al día por si alguno sabe el por qué de esta nueva situación.
Resulta que ya se por qué intentaba abrir el puerto cero y algunas cosas más, la respuesta me dejó con muchas más dudas. La razón por la que se intenta abrir el COM0 es que por alguna razón cuando la funcion lee los datos, los lee de forma revuelta, me explico, la estructura original es la siguiente:
Nota: La cual por cierto si en lugar de char pongo byte o string o cualquier otra, jamás funciona ni el OpenPort, lo mismo con el long. Lo que me di cuenta es que la función esta por ejemplo tomando el 5° char de la estructura como el puerto, sin importar el nombre del campo, es decir como en esa estrutura el 5° char era CommandDataLength y ese iniciaba en cero por eso intentaba abrir el COM0 y cualquier valor que le pusiera en CommandDataLength lo tomaba como el puerto a abrir, cosa que se me hizo demasiado extraño ya que cualquier campo que ponga en dicho lugar tiene el mismo efecto. Nunca me había pasado algo así. Saben por qué puede estar pasando eso o si de plano tiene que ver por completo con como hicieron la dll? Por que en el C++ no pasa eso y ciertamente no logro ver que tengo diferente. El puerto abre correctamente cuando pongo el puerto que quiero en dicha posición, pero me pasa lo mismo al enviar un comando y ahí si son tantos campos que no podría identificar cada uno en su lugar y por consiguiente no se ejecuta con éxito. |
Puede ser por la longitud del tipo de dato, no recuerdo de memoria, pero puede que long (por ejemplo) sea distinto en delphi y c++, en uno 16 bits y en otro 32 bits. Es sólo un ejemplo, para que se entienda.
|
Cita:
http://docwiki.embarcadero.com/RADSt..._types_mapping |
Habría que ver exactamente como es el archivo cabecera en C para ver se aplican alineación al código. Otra forma de saberlo es conocer el tamaño de la estructura en C. Las estructuras pueden estar alineadas en memoria dando como resultado tamaños diferentes a los esperados. Al traducir a delphi estas cosas hay que conocerlas, como saber que para C char tiene siempre tamaño 1 y que es indiferente de BYTE. En delphi unicode CHAR tiene tamaño 2 por lo que la traducción debe ser a AnsiChar o a Byte, según el contexto.
Ya que no dispongo de la dll en cuestión no puedo hacer pruebas pero propongo probar con esta definición:
Se fuerza una alineación a 1 pero se puede forzar a también a 2, 4, 8 o 16. Para una alineación = 1 sizeof(TSSP_COMMAND) devolvería 542 Diego E. los copiladores no interpretan nada revuelto simplemente cometemos errores en el tamaño de los tipos o su alineación. Otra forma de equivocarse es en interpretar erróneamente los datos con sus punteros. Saludos. |
La franja horaria es GMT +2. Ahora son las 04:16:32. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi