![]() |
| |||||||
| Registrarse | Preguntas Frecuentes | Lista de Foreros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
| | LinkBack | Herramientas | Desplegado |
| |||
| En alguna llamada a la Dll utilizas strings ? -- - "Deberiamos llegar a ser lo que creemos que ya somos" EchM#828 Sector Gazpacho "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje news:c18h6n$5vk1***eui1nw.euskaltel.es... > Tengo un problema cuya solución no consigo dar, y es el siguiente: > > Suponiendo una aplicación y una librería dll ambas creadas por mi con > Delphi 7, la aplicación implementa un objeto compuesto por una lista > (TList) de punteros a registros formados por una serie de variables. La > aplicación llama a una función de la librería pasando ese objeto TList > por referencia. Esta función se encarga de crear unos 5 registros > mediante system.new(Registro) y añadir el puntero de cada registro a la > lista. Finalizada la función, el programa dispone de los 5 registros y > accede a ellos a través de los punteros que contiene el TList. > Posteriormente elimina los registros mediante un > dispose(tlist.items[contador]). > > Hasta aquí todo funciona correctamente. Los registros se eliminan y > finalmente se limpia la lista con un clear en TList. El problema viene > si se intenta llamar a la función de la librería por segunda vez. La > función vuelve a retornar los 5 registros y están perfectamente > referenciados sus punteros en el TList. La aplicación los recibe > correctamente igual que la primera vez. Pero al eliminar de nuevo los > registros, al hacer un dispose en el último registro (y siempre es en el > último registro) la aplicación genera un error de excepción del tipo > EInvalidPointerOperation. > > Una vez depurado, me consta que ese último puntero se apunta > correctamente al último registro. La función system.new en la librería > no falla (se comprueba), se añade correctamente el puntero a la lista y > depurando la aplicación veo correctamente todos los registros apuntados > por la lista de punteros justo antes de proceder a su "dispose". Sin > embargo por razones que desconozco siempre falla en el último puntero, > que a simple vista es válido. La creación, edición y eliminación de los > registros es similar tanto en la aplicación como en la librería ya que > ambos usan la misma unidad desarrollada por mi. Si repito esa operación > de forma autónoma, es decir, si desde la propia aplicación, creo y > elimino dichos registros, todo funciona correctamente. Luego no es error > del código (en principio)... > > ¿Es eso un error de delphi? ¿De Windows XP? ¿Un error de concepto por mi > parte en el tratamiento de datos trabajando con librerías dll? > > > Saludos, JKD |
| | ||||
| ||||
| |
| |||
| Los registros que se crean en la dll mediante system.new están formados en principio por un tipo record que contiene una variable de tipo string y otra de tipo variant (usado para almacenar, dependiendo del caso, un booleano, integer o string). Probé a usar sharemem como indica la ayuda de d7 pero el resultado es el mismo. Probé también a sustituir la variable string por un array [0.255] de tipo char e incluso ese variant por variables Boolean, Integer y array [0..255] of char pero falla igualmente. Saludos, JKD jotajota wrote: > En alguna llamada a la Dll utilizas strings ? > > -- > - > "Deberiamos llegar a ser lo que creemos que ya somos" > EchM#828 > Sector Gazpacho > > "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje > news:c18h6n$5vk1***eui1nw.euskaltel.es... > >>Tengo un problema cuya solución no consigo dar, y es el siguiente: >> >>Suponiendo una aplicación y una librería dll ambas creadas por mi con >>Delphi 7, la aplicación implementa un objeto compuesto por una lista >>(TList) de punteros a registros formados por una serie de variables. La >>aplicación llama a una función de la librería pasando ese objeto TList >>por referencia. Esta función se encarga de crear unos 5 registros >>mediante system.new(Registro) y añadir el puntero de cada registro a la >>lista. Finalizada la función, el programa dispone de los 5 registros y >>accede a ellos a través de los punteros que contiene el TList. >>Posteriormente elimina los registros mediante un >>dispose(tlist.items[contador]). >> >>Hasta aquí todo funciona correctamente. Los registros se eliminan y >>finalmente se limpia la lista con un clear en TList. El problema viene >>si se intenta llamar a la función de la librería por segunda vez. La >>función vuelve a retornar los 5 registros y están perfectamente >>referenciados sus punteros en el TList. La aplicación los recibe >>correctamente igual que la primera vez. Pero al eliminar de nuevo los >>registros, al hacer un dispose en el último registro (y siempre es en el >>último registro) la aplicación genera un error de excepción del tipo >>EInvalidPointerOperation. >> >>Una vez depurado, me consta que ese último puntero se apunta >>correctamente al último registro. La función system.new en la librería >>no falla (se comprueba), se añade correctamente el puntero a la lista y >>depurando la aplicación veo correctamente todos los registros apuntados >>por la lista de punteros justo antes de proceder a su "dispose". Sin >>embargo por razones que desconozco siempre falla en el último puntero, >>que a simple vista es válido. La creación, edición y eliminación de los >>registros es similar tanto en la aplicación como en la librería ya que >>ambos usan la misma unidad desarrollada por mi. Si repito esa operación >>de forma autónoma, es decir, si desde la propia aplicación, creo y >>elimino dichos registros, todo funciona correctamente. Luego no es error >> del código (en principio)... >> >>¿Es eso un error de delphi? ¿De Windows XP? ¿Un error de concepto por mi >>parte en el tratamiento de datos trabajando con librerías dll? >> >> >>Saludos, JKD > > > |
| |||
| Los registros que se crean en la dll mediante system.new están formados en principio por un tipo record que contiene una variable de tipo string y otra de tipo variant (usado para almacenar, dependiendo del caso, un booleano, integer o string). Probé a usar sharemem como indica la ayuda de d7 pero el resultado es el mismo. Probé también a sustituir la variable string por un array [0.255] de tipo char e incluso ese variant por variables Boolean, Integer y array [0..255] of char pero falla igualmente. Saludos, JKD jotajota wrote: > En alguna llamada a la Dll utilizas strings ? > > -- > - > "Deberiamos llegar a ser lo que creemos que ya somos" > EchM#828 > Sector Gazpacho > > "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje > news:c18h6n$5vk1***eui1nw.euskaltel.es... > >>Tengo un problema cuya solución no consigo dar, y es el siguiente: >> >>Suponiendo una aplicación y una librería dll ambas creadas por mi con >>Delphi 7, la aplicación implementa un objeto compuesto por una lista >>(TList) de punteros a registros formados por una serie de variables. La >>aplicación llama a una función de la librería pasando ese objeto TList >>por referencia. Esta función se encarga de crear unos 5 registros >>mediante system.new(Registro) y añadir el puntero de cada registro a la >>lista. Finalizada la función, el programa dispone de los 5 registros y >>accede a ellos a través de los punteros que contiene el TList. >>Posteriormente elimina los registros mediante un >>dispose(tlist.items[contador]). >> >>Hasta aquí todo funciona correctamente. Los registros se eliminan y >>finalmente se limpia la lista con un clear en TList. El problema viene >>si se intenta llamar a la función de la librería por segunda vez. La >>función vuelve a retornar los 5 registros y están perfectamente >>referenciados sus punteros en el TList. La aplicación los recibe >>correctamente igual que la primera vez. Pero al eliminar de nuevo los >>registros, al hacer un dispose en el último registro (y siempre es en el >>último registro) la aplicación genera un error de excepción del tipo >>EInvalidPointerOperation. >> >>Una vez depurado, me consta que ese último puntero se apunta >>correctamente al último registro. La función system.new en la librería >>no falla (se comprueba), se añade correctamente el puntero a la lista y >>depurando la aplicación veo correctamente todos los registros apuntados >>por la lista de punteros justo antes de proceder a su "dispose". Sin >>embargo por razones que desconozco siempre falla en el último puntero, >>que a simple vista es válido. La creación, edición y eliminación de los >>registros es similar tanto en la aplicación como en la librería ya que >>ambos usan la misma unidad desarrollada por mi. Si repito esa operación >>de forma autónoma, es decir, si desde la propia aplicación, creo y >>elimino dichos registros, todo funciona correctamente. Luego no es error >> del código (en principio)... >> >>¿Es eso un error de delphi? ¿De Windows XP? ¿Un error de concepto por mi >>parte en el tratamiento de datos trabajando con librerías dll? >> >> >>Saludos, JKD > > > |
| |||
| Yo probaria de crear un objeto en lugar de un record y haces un create y un free del objeto... "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje news:c1i36c$cge2***eui1nw.euskaltel.es... > Los registros que se crean en la dll mediante system.new están formados > en principio por un tipo record que contiene una variable de tipo string > y otra de tipo variant (usado para almacenar, dependiendo del caso, un > booleano, integer o string). Probé a usar sharemem como indica la ayuda > de d7 pero el resultado es el mismo. Probé también a sustituir la > variable string por un array [0.255] de tipo char e incluso ese variant > por variables Boolean, Integer y array [0..255] of char pero falla > igualmente. > > Saludos, JKD > > jotajota wrote: > > > En alguna llamada a la Dll utilizas strings ? > > > > -- > > - > > "Deberiamos llegar a ser lo que creemos que ya somos" > > EchM#828 > > Sector Gazpacho > > > > "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje > > news:c18h6n$5vk1***eui1nw.euskaltel.es... > > > >>Tengo un problema cuya solución no consigo dar, y es el siguiente: > >> > >>Suponiendo una aplicación y una librería dll ambas creadas por mi con > >>Delphi 7, la aplicación implementa un objeto compuesto por una lista > >>(TList) de punteros a registros formados por una serie de variables. La > >>aplicación llama a una función de la librería pasando ese objeto TList > >>por referencia. Esta función se encarga de crear unos 5 registros > >>mediante system.new(Registro) y añadir el puntero de cada registro a la > >>lista. Finalizada la función, el programa dispone de los 5 registros y > >>accede a ellos a través de los punteros que contiene el TList. > >>Posteriormente elimina los registros mediante un > >>dispose(tlist.items[contador]). > >> > >>Hasta aquí todo funciona correctamente. Los registros se eliminan y > >>finalmente se limpia la lista con un clear en TList. El problema viene > >>si se intenta llamar a la función de la librería por segunda vez. La > >>función vuelve a retornar los 5 registros y están perfectamente > >>referenciados sus punteros en el TList. La aplicación los recibe > >>correctamente igual que la primera vez. Pero al eliminar de nuevo los > >>registros, al hacer un dispose en el último registro (y siempre es en el > >>último registro) la aplicación genera un error de excepción del tipo > >>EInvalidPointerOperation. > >> > >>Una vez depurado, me consta que ese último puntero se apunta > >>correctamente al último registro. La función system.new en la librería > >>no falla (se comprueba), se añade correctamente el puntero a la lista y > >>depurando la aplicación veo correctamente todos los registros apuntados > >>por la lista de punteros justo antes de proceder a su "dispose". Sin > >>embargo por razones que desconozco siempre falla en el último puntero, > >>que a simple vista es válido. La creación, edición y eliminación de los > >>registros es similar tanto en la aplicación como en la librería ya que > >>ambos usan la misma unidad desarrollada por mi. Si repito esa operación > >>de forma autónoma, es decir, si desde la propia aplicación, creo y > >>elimino dichos registros, todo funciona correctamente. Luego no es error > >> del código (en principio)... > >> > >>¿Es eso un error de delphi? ¿De Windows XP? ¿Un error de concepto por mi > >>parte en el tratamiento de datos trabajando con librerías dll? > >> > >> > >>Saludos, JKD > > > > > > |
| |||
| Yo probaria de crear un objeto en lugar de un record y haces un create y un free del objeto... "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje news:c1i36c$cge2***eui1nw.euskaltel.es... > Los registros que se crean en la dll mediante system.new están formados > en principio por un tipo record que contiene una variable de tipo string > y otra de tipo variant (usado para almacenar, dependiendo del caso, un > booleano, integer o string). Probé a usar sharemem como indica la ayuda > de d7 pero el resultado es el mismo. Probé también a sustituir la > variable string por un array [0.255] de tipo char e incluso ese variant > por variables Boolean, Integer y array [0..255] of char pero falla > igualmente. > > Saludos, JKD > > jotajota wrote: > > > En alguna llamada a la Dll utilizas strings ? > > > > -- > > - > > "Deberiamos llegar a ser lo que creemos que ya somos" > > EchM#828 > > Sector Gazpacho > > > > "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje > > news:c18h6n$5vk1***eui1nw.euskaltel.es... > > > >>Tengo un problema cuya solución no consigo dar, y es el siguiente: > >> > >>Suponiendo una aplicación y una librería dll ambas creadas por mi con > >>Delphi 7, la aplicación implementa un objeto compuesto por una lista > >>(TList) de punteros a registros formados por una serie de variables. La > >>aplicación llama a una función de la librería pasando ese objeto TList > >>por referencia. Esta función se encarga de crear unos 5 registros > >>mediante system.new(Registro) y añadir el puntero de cada registro a la > >>lista. Finalizada la función, el programa dispone de los 5 registros y > >>accede a ellos a través de los punteros que contiene el TList. > >>Posteriormente elimina los registros mediante un > >>dispose(tlist.items[contador]). > >> > >>Hasta aquí todo funciona correctamente. Los registros se eliminan y > >>finalmente se limpia la lista con un clear en TList. El problema viene > >>si se intenta llamar a la función de la librería por segunda vez. La > >>función vuelve a retornar los 5 registros y están perfectamente > >>referenciados sus punteros en el TList. La aplicación los recibe > >>correctamente igual que la primera vez. Pero al eliminar de nuevo los > >>registros, al hacer un dispose en el último registro (y siempre es en el > >>último registro) la aplicación genera un error de excepción del tipo > >>EInvalidPointerOperation. > >> > >>Una vez depurado, me consta que ese último puntero se apunta > >>correctamente al último registro. La función system.new en la librería > >>no falla (se comprueba), se añade correctamente el puntero a la lista y > >>depurando la aplicación veo correctamente todos los registros apuntados > >>por la lista de punteros justo antes de proceder a su "dispose". Sin > >>embargo por razones que desconozco siempre falla en el último puntero, > >>que a simple vista es válido. La creación, edición y eliminación de los > >>registros es similar tanto en la aplicación como en la librería ya que > >>ambos usan la misma unidad desarrollada por mi. Si repito esa operación > >>de forma autónoma, es decir, si desde la propia aplicación, creo y > >>elimino dichos registros, todo funciona correctamente. Luego no es error > >> del código (en principio)... > >> > >>¿Es eso un error de delphi? ¿De Windows XP? ¿Un error de concepto por mi > >>parte en el tratamiento de datos trabajando con librerías dll? > >> > >> > >>Saludos, JKD > > > > > > |
| |||
| Yo probaria de crear un objeto en lugar de un record y haces un create y un free del objeto... "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje news:c1i36c$cge2***eui1nw.euskaltel.es... > Los registros que se crean en la dll mediante system.new están formados > en principio por un tipo record que contiene una variable de tipo string > y otra de tipo variant (usado para almacenar, dependiendo del caso, un > booleano, integer o string). Probé a usar sharemem como indica la ayuda > de d7 pero el resultado es el mismo. Probé también a sustituir la > variable string por un array [0.255] de tipo char e incluso ese variant > por variables Boolean, Integer y array [0..255] of char pero falla > igualmente. > > Saludos, JKD > > jotajota wrote: > > > En alguna llamada a la Dll utilizas strings ? > > > > -- > > - > > "Deberiamos llegar a ser lo que creemos que ya somos" > > EchM#828 > > Sector Gazpacho > > > > "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje > > news:c18h6n$5vk1***eui1nw.euskaltel.es... > > > >>Tengo un problema cuya solución no consigo dar, y es el siguiente: > >> > >>Suponiendo una aplicación y una librería dll ambas creadas por mi con > >>Delphi 7, la aplicación implementa un objeto compuesto por una lista > >>(TList) de punteros a registros formados por una serie de variables. La > >>aplicación llama a una función de la librería pasando ese objeto TList > >>por referencia. Esta función se encarga de crear unos 5 registros > >>mediante system.new(Registro) y añadir el puntero de cada registro a la > >>lista. Finalizada la función, el programa dispone de los 5 registros y > >>accede a ellos a través de los punteros que contiene el TList. > >>Posteriormente elimina los registros mediante un > >>dispose(tlist.items[contador]). > >> > >>Hasta aquí todo funciona correctamente. Los registros se eliminan y > >>finalmente se limpia la lista con un clear en TList. El problema viene > >>si se intenta llamar a la función de la librería por segunda vez. La > >>función vuelve a retornar los 5 registros y están perfectamente > >>referenciados sus punteros en el TList. La aplicación los recibe > >>correctamente igual que la primera vez. Pero al eliminar de nuevo los > >>registros, al hacer un dispose en el último registro (y siempre es en el > >>último registro) la aplicación genera un error de excepción del tipo > >>EInvalidPointerOperation. > >> > >>Una vez depurado, me consta que ese último puntero se apunta > >>correctamente al último registro. La función system.new en la librería > >>no falla (se comprueba), se añade correctamente el puntero a la lista y > >>depurando la aplicación veo correctamente todos los registros apuntados > >>por la lista de punteros justo antes de proceder a su "dispose". Sin > >>embargo por razones que desconozco siempre falla en el último puntero, > >>que a simple vista es válido. La creación, edición y eliminación de los > >>registros es similar tanto en la aplicación como en la librería ya que > >>ambos usan la misma unidad desarrollada por mi. Si repito esa operación > >>de forma autónoma, es decir, si desde la propia aplicación, creo y > >>elimino dichos registros, todo funciona correctamente. Luego no es error > >> del código (en principio)... > >> > >>¿Es eso un error de delphi? ¿De Windows XP? ¿Un error de concepto por mi > >>parte en el tratamiento de datos trabajando con librerías dll? > >> > >> > >>Saludos, JKD > > > > > > |
| |||
| Yo probaria de crear un objeto en lugar de un record y haces un create y un free del objeto... "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje news:c1i36c$cge2***eui1nw.euskaltel.es... > Los registros que se crean en la dll mediante system.new están formados > en principio por un tipo record que contiene una variable de tipo string > y otra de tipo variant (usado para almacenar, dependiendo del caso, un > booleano, integer o string). Probé a usar sharemem como indica la ayuda > de d7 pero el resultado es el mismo. Probé también a sustituir la > variable string por un array [0.255] de tipo char e incluso ese variant > por variables Boolean, Integer y array [0..255] of char pero falla > igualmente. > > Saludos, JKD > > jotajota wrote: > > > En alguna llamada a la Dll utilizas strings ? > > > > -- > > - > > "Deberiamos llegar a ser lo que creemos que ya somos" > > EchM#828 > > Sector Gazpacho > > > > "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje > > news:c18h6n$5vk1***eui1nw.euskaltel.es... > > > >>Tengo un problema cuya solución no consigo dar, y es el siguiente: > >> > >>Suponiendo una aplicación y una librería dll ambas creadas por mi con > >>Delphi 7, la aplicación implementa un objeto compuesto por una lista > >>(TList) de punteros a registros formados por una serie de variables. La > >>aplicación llama a una función de la librería pasando ese objeto TList > >>por referencia. Esta función se encarga de crear unos 5 registros > >>mediante system.new(Registro) y añadir el puntero de cada registro a la > >>lista. Finalizada la función, el programa dispone de los 5 registros y > >>accede a ellos a través de los punteros que contiene el TList. > >>Posteriormente elimina los registros mediante un > >>dispose(tlist.items[contador]). > >> > >>Hasta aquí todo funciona correctamente. Los registros se eliminan y > >>finalmente se limpia la lista con un clear en TList. El problema viene > >>si se intenta llamar a la función de la librería por segunda vez. La > >>función vuelve a retornar los 5 registros y están perfectamente > >>referenciados sus punteros en el TList. La aplicación los recibe > >>correctamente igual que la primera vez. Pero al eliminar de nuevo los > >>registros, al hacer un dispose en el último registro (y siempre es en el > >>último registro) la aplicación genera un error de excepción del tipo > >>EInvalidPointerOperation. > >> > >>Una vez depurado, me consta que ese último puntero se apunta > >>correctamente al último registro. La función system.new en la librería > >>no falla (se comprueba), se añade correctamente el puntero a la lista y > >>depurando la aplicación veo correctamente todos los registros apuntados > >>por la lista de punteros justo antes de proceder a su "dispose". Sin > >>embargo por razones que desconozco siempre falla en el último puntero, > >>que a simple vista es válido. La creación, edición y eliminación de los > >>registros es similar tanto en la aplicación como en la librería ya que > >>ambos usan la misma unidad desarrollada por mi. Si repito esa operación > >>de forma autónoma, es decir, si desde la propia aplicación, creo y > >>elimino dichos registros, todo funciona correctamente. Luego no es error > >> del código (en principio)... > >> > >>¿Es eso un error de delphi? ¿De Windows XP? ¿Un error de concepto por mi > >>parte en el tratamiento de datos trabajando con librerías dll? > >> > >> > >>Saludos, JKD > > > > > > |
| |||
| En delphi 5, ese problema lo tenía si usaba un parámetro de llamada a alguna función como string, y en el 7 no se si tiene el mismo problema, pero en el 5 con la optimización habilitada también da ese fallo, puedes probar a recompilar la Dll sin usar opimización. Saludos Juanjo. -- - "Deberiamos llegar a ser lo que creemos que ya somos" EchM#828 Sector Gazpacho "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje news:c1i36c$cge2***eui1nw.euskaltel.es... > Los registros que se crean en la dll mediante system.new están formados > en principio por un tipo record que contiene una variable de tipo string > y otra de tipo variant (usado para almacenar, dependiendo del caso, un > booleano, integer o string). Probé a usar sharemem como indica la ayuda > de d7 pero el resultado es el mismo. Probé también a sustituir la > variable string por un array [0.255] de tipo char e incluso ese variant > por variables Boolean, Integer y array [0..255] of char pero falla > igualmente. > > Saludos, JKD > |
| |||
| En delphi 5, ese problema lo tenía si usaba un parámetro de llamada a alguna función como string, y en el 7 no se si tiene el mismo problema, pero en el 5 con la optimización habilitada también da ese fallo, puedes probar a recompilar la Dll sin usar opimización. Saludos Juanjo. -- - "Deberiamos llegar a ser lo que creemos que ya somos" EchM#828 Sector Gazpacho "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje news:c1i36c$cge2***eui1nw.euskaltel.es... > Los registros que se crean en la dll mediante system.new están formados > en principio por un tipo record que contiene una variable de tipo string > y otra de tipo variant (usado para almacenar, dependiendo del caso, un > booleano, integer o string). Probé a usar sharemem como indica la ayuda > de d7 pero el resultado es el mismo. Probé también a sustituir la > variable string por un array [0.255] de tipo char e incluso ese variant > por variables Boolean, Integer y array [0..255] of char pero falla > igualmente. > > Saludos, JKD > |
| |||
| En delphi 5, ese problema lo tenía si usaba un parámetro de llamada a alguna función como string, y en el 7 no se si tiene el mismo problema, pero en el 5 con la optimización habilitada también da ese fallo, puedes probar a recompilar la Dll sin usar opimización. Saludos Juanjo. -- - "Deberiamos llegar a ser lo que creemos que ya somos" EchM#828 Sector Gazpacho "JKD" <JKD***JKDSoft.cjb.net> escribió en el mensaje news:c1i36c$cge2***eui1nw.euskaltel.es... > Los registros que se crean en la dll mediante system.new están formados > en principio por un tipo record que contiene una variable de tipo string > y otra de tipo variant (usado para almacenar, dependiendo del caso, un > booleano, integer o string). Probé a usar sharemem como indica la ayuda > de d7 pero el resultado es el mismo. Probé también a sustituir la > variable string por un array [0.255] de tipo char e incluso ese variant > por variables Boolean, Integer y array [0..255] of char pero falla > igualmente. > > Saludos, JKD > |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |