Dios!!!!!!!!!!! Por segunda vez tengo que escribir toda la respuesta entera. Si es que no aprendo. Mierda de ie
. He dejado demasiado tiempo abierta la respuesta, y cuando me he puesto a continuar escribiendo (un buen tocho) y a mandarlo, resulta que me había desreristrado!!!! Y he perdido la respuesta.
Joder, por que no lo hago directamente con Opera??? Porque soy tonto
. Opera si recupera lo escrito si le das a la página anterior.
Bueno, después de haberme desahogado un poco, vamos otra vez:
Ximorro escribió:¿Quién ha dicho que yo no remapeo la estructura y no tengo en cuenta los cambios de tipos de datos? de hecho incluso he utilizado esas palabras en los comentarios... vaya no están numerados, bueno, en mis dos últimos Por ejemplo en el código que remapea:Código: Seleccionar todo$mmtime = DllStructCreate("uint wType; byte union[8]") ;Ahora se llama a la DLL, la cual escribe en la estructura ;Leemos wType y resulta que vale TIME_SMPTE así que remapeamos toda la estructura:$nueva_mmtime = DllStructCreate("uint wType; byte hour; byte min; byte sec; byte frame; byte fps; byte[3]", DllStructGetPtr($mmtime))Claro que tengo en cuenta los cambios de datos, precisamente por eso decía que no era importante para la DLL porque la podíamos llamar con la estructura incorrecta mientras tenga el tamaño correcto, la DLL la rellenará bien... ¡pero que la estructura correcta era importantísima para poder leer/escribir en AutoIt! Por eso he hecho lo del remapeo...
Ya se que habías puesto todo eso, pero pensé que el ejemplo que pusiste no era adecuado o estaba incompleto. Has redefinido la estructura inicial DllStructCreate("uint wType; byte union[8]") a DllStructCreate("uint wType; byte hour; byte min; byte sec; byte frame; byte fps; byte[3]", DllStructGetPtr($mmtime)) cuando el argumento wType es igual a TIME_SMPTE. Pienso que ese ejemplo, aunque hay que hacerlo, es el menos importante, ya que incluso si no la reestructuras puedes recuperar los datos directamente por su índice al haberla definido con un vector de 8 bytes
. Digamos que deberías haber puesto como ejemplo el otro caso, o haber completado la explicación poniendo el otro caso también, que sería que cuando wType es distinto de TIME_SMPT, hay que reestructurar (redefinir, remapear, etc) la estructura inicial poniendo un segundo parámetro tipo dword, DllStructCreate("uint wType;dword general", DllStructGetPtr($mmtime)). Así quedaba la cosa más clara.
Por eso puse todo ese rollo, para dejar la cosa clara. Tampoco podía saber yo si se te había pasado el ponerlo, si te habías confundido (conociendote suponía que no
), o si era un pequeño ejemplo de como se podía realizar la estructura, mostrando solamente uno de los casos (creo que era esto por lo que pones más abajo en tu post anterior). Pero hay que reconocer que si llegas a añadir eso la cosa hubiese quedado más clara
.
Ximorro escribió:OJO con la función de ProgAndy, sé que este tío es un gurú del AutoIt y hace muchísimo tiempo que se ganó todo mi respeto, pero en este caso creo que hay un pequeño fallo, y es que no crea la estructura con todo el tamaño correcto, si haces:Return DllStructCreate("UINT wType; DWORD ms",$ptr)Te falta reservar 4 bytes. Ciertamente si la función está bien escrita no intentará acceder a ese espacio de memoria, pero si quisiera (por ejemplo un soft malintencionado) podría hacerlo pues la estructura que debe ser pasada ha de ser de tipo MMTIME, ¡y eso tiene 4 bytes más que la creada en AutoIt!Es como el típico fallo de seguridad de acceso a índices fuera de matriz... pero con campos fuera de estructura.
Pienso igual que tú, ProgAndy es la ostia, entre varios más del foro de habla inglesa. Pero claro, esos tíos saben mucho más que nosotros AutoIt. También saben c y c++ y que se yo que lenguajes más. Además, muchos de ellos han contribuido (y siguen haciendolo) a la creación/actualización de AutoIt. Como para saber más que ellos!!!!!
. Pero también digo una cosa, hasta el más sabio se puede equivocar
.
Sobre lo otro que comentas, pienso que la función esta perfectamente definida. No tiene porque dar ningún tipo de problemas. No creo que tenga importancia que defina o no esos 4 bytes que pueden quedar libres, ya que en ningún momento se van a utilizar.
Sobre lo de los virus, pienso que tampoco tendríamos que ser tan paranoicos
. Tendría que ser un virus muy específico no?
. Ademas, veo peor que se meta en los bytes que utiliza la función poniendo valores distintos para cambiar el resultado o petar el programa, que escriba sobre unos bytes vacios que no se van a utilizar
. Encima esos bytes van a ser escritos por la función que utilize la estructura. Machacarían lo que escribiese cualquier programa malicioso. En resumen, no podemos pensar en esas cosas tan rebuscadas, porque entonces no programaríamos nada
.
Ximorro escribió:La segunda parte que puse con el remapeo es por si no sabemos de qué tipo son los datos, pero si se sabe el valor de wType desde el principio es más fácil, simplemente se crea la estructura según nos interesa y ya está (pero rellenando para que la estructura de AutoIt ocupe lo mismo que la declarada en C, como decía en los párrafos anteriores)
Estoy deacuerdo contigo. Pero si lo que se pretende es hacer una udf con estas funciones, estructuras y demás, se debe utilizar una función para que el usuario la defina cuando quiera de la forma más facil posible......pienso yo.
Ahora contesto al post de Jonny:
Te mato!!!!! Te mato!!!! Te maaaaaaaaaaaaaaaatooooooooooooooo!!!!
Jonny, tu has leído los post que te hemos escrito Ximorro y yo sobre el tamaño de la estructura y demás????
Pero que clase de definición inicial de la estructura es esta:
Jonny escribió:$_MMTimeStruct=DllStructCreate("uint wType;dword[4];byte hour;byte min;byte sec;byte frame;byte fps;byte dummy;byte pad[2];dword songptrpos")
Te lo digo yo, una caca
.
Lo hemos repetido hasta la saciedad.....inicialmente define el segundo parámetro de un tamaño máximo de 8 bytes!!!!! Defínelo como quieras, con 8 bytes, con 2 dword, con 4 word, con lo que quieras que formen 8 bytes, pero que el 2º parámetro reserve 8 bytes!!!!! Para que más. Para desperdiciar memoria y definir fatal la estructura? Aunque luego te funcione porque con la función redefine luego bien los parámetros, y utilizará solamente esos bytes, no es escusa de hacerlo mal.
De la forma que la has definido, utilizas 24 bytes de más, que no los necesitas para nada!!!!!.
Anda y cambialo.
Jonny escribió:parecía funcionar la api, por lo menos devolvía 0...
Pues te aseguro que no funcionaría. Funcionaría pero mal. Los datos dword si los alamacenaría bien en el primer elemento, pero si wType era TIME_SMPT, no podrías recuperar los datos bien porque no la tenías bien definada (tienes que cambiar el dword por los 8 elementos tipo byte).
Jonny escribió:Ahora con la modificación que le he hecho para crear la estructura con la función de ProgAndy, devuelve 1 (en la documentación no especifican ese valor en los valores de retorno).
Mejor no la toque que está bien definida. Es ahora la tuya la que está mal definida con argumentos innecesarios
.
Jonny escribió:En la función de ProgAndy, he modificado algunas cosas. Por ejemplo:Código: Seleccionar todoLocal $type = DllStructCreate("uint",$ptr)Lo he quitado, porque no veo que haga nada en la función (no se por qué estará).
Para matarte
. Como quitas eso? Con eso accede al primer argumento de la estructura (wType, lo que pasa que no pone el nombre del parámetro, solo pone su tipo uint) para luego poder recuperar su valor y compararlo con el switch case.
Tu te lo has cargado y has tenido que meter un argumento de más a la función para acceder a la estructura original directamente (sin puntero) y poder recuperar wType. No hagas eso!!!!
. Y si no sabes pregunta que es gratis.
Jonny escribió:Global Const $_Time_Mididonde yo pongo "16", y ProgAndy "0x10".Código: Seleccionar todoGlobal Const $_Time_Ticksdonde yo pongo "32", y ProgAndy "0x20".
Jonny, cuando te digo a veces que te falta base para hacer estas cosas, me sueltas cosas de estas y veo que no me equivoco
. Hombre, esos valores, los de PorgAndy y los tuyos, son totalmente iguales. Lo que pasa que tu los representas en decimal (del 0 al 9) y él de hexadecimal (del 0 al F (F=15)). Mira en google la representación de números en hexadecimal, que para un programador es esencial.
Saludos.