![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#21
|
|||
|
|||
Realmente me resulta raro, hace un tiempo, para que mis Qreport pudieran funcionar en windows 10, tube que cambiar los Fonts de "Courrier New" a "Arial", porque se rompia. Lo cambiamos el año pasado y con Arial funcionaba perfecto. Despues de la actualizacion agua...... Sera que ahora hay que volver a cambiar de fuente ?????
|
#22
|
|||
|
|||
Cita:
|
#23
|
||||
|
||||
Hola.
Yo he cambiado todos los tipos de letra de los reportes de "Arial" a "Tahoma" y funciona perfectamente!! La verdad es que no me lo explico. ¿Alguuien tiene alguna explicación? Saludos. Adolfo de Bonis. |
#24
|
||||
|
||||
![]() ![]() ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#25
|
|||
|
|||
Cita:
|
#26
|
||||
|
||||
Cita:
Muchas gracias !!
__________________
Ya tengo Firma! |
#27
|
|||
|
|||
Felicitaciones !!!!
Muchas Gracias!!!! Funciona Perfecto !!!!!!!!!!
|
#28
|
||||
|
||||
Cita:
![]() ![]() ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#29
|
|||
|
|||
me pasaron la solucion
En QRPDFFilt.pas reemplazar las llamadas a las funciones cvtInt y cvtDword
x := cvtInt(Buff, y); se convierte en estas dos lineas: P := y; x := (256*byte(Buff[P]))+(byte(Buff[P+1])); Y x := cvtDword(Buff, y); becomes P := y; x :=(256*256*256*byte(Buff[P]))+(256*256*byte(Buff[P+1]))+(256*byte(Buff[P+2]))+byte(Buff[P+3]); Funciona perfecto... |
#30
|
||||
|
||||
No olvides poner las etiquetas para el código:
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#31
|
|||
|
|||
In QRPDFFilt.pas replace calls to functions cvtInt and cvtDword with inline code
becomes 2 lines
and
se convierte en
|
#32
|
|||
|
|||
![]() Hola
Ante todo gracias por dejarme formar parte de vuestro foro ya que, gracias a vosotros he podido encontrar la guía que me ha llevado a la solución correcta y poder compartirla con vosotros. Aunque la solución que dais puede que funcione, no es la correcta ya que lo único que hace es disimular el problema pero éste permanece latente y te puede explotar por otro lado. El problema es que, desde la última actualización de W10(1803) las fuentes parece ser que son más ricas en cuanto a información(probablemente para trabajar mejor con pantallas de alta resolución) y la información recogida por la función GetFontData para, por ejemplo, la fuente Arial se ha triplicado. Por ejemplo en la penúltima versión de W10, antes de la actualización "maldita"(1803), GetFontData devolvía unos 350.000 bytes de información y ahora devuelve aproximadamente 1.500.000. El buffer donde se recoge la información de GetFontData es inicializado como una PByteArray con SetLength() y, desgraciadamente esta función parece sufrir un desbordamiento cuando intenta reservar tanta memoria. Yo he hecho todo el proceso con QuickReport 5.02 y C++Builder 6 pero seguro que se puede aplicar a mas versiones de Delphi Esto se puede encontrar dentro del módulo QRPDFFilt procedure MakeTTFont dentro de la sección 'var' Canviar por:
Esto nos permitirá tratar la infomación como un puntero a una matriz de Bytes y, en vez de usar el gestionador de memoria de Delphi para generar matrices (arrays) de longitud variable (y que es lo que falla realmente cuando se le pide una cantidad tan astronómica de Bytes mediante SetLength()), utilizar otro más potente del propio Windows: CoTaskMemAlloc. Éste seguro que no se quedará corto a la hora de guardar memoria ya que es el que utiliza Windows para su tecnología COM Para poder usar CoTaskMemAlloc necesitamos poner en la clausula uses de QRPDFFilt 'ActiveX' (naturalmente sin las comillas). Yo lo he puesto después de Db, pero podría ser en cualquier parte de dicha cláusula uses
Y ahora viene lo bueno: Hacia la línea de código 1628 del módulo QRPDFFilt, donde se hace la reserva de memoria para recuperar la informació de 'GetFontData' SUBSTITUIR: POR ESTAS DOS LÍNEAS
Como ahora la memoria reservada no se libera sola, hemos de llamar a CoTraskMemFree. Para ello, en la clausula 'finally'(linea 1627 aproximadamente) que aparece más abajo (justo debajo de SetEncoding) añadir la siguiente línea:
Como ahora pasamos un PByteArray a las funciones cvtInt y cvtDWord hemos de canviar sus argumentos quedando las declaraciones de la siguiente manera (el cuerpo de las funciones queda exactamente igual)
Y ya está!!! ahora sí que podeis generar los pdf's sin miedo a desbordamientos de memoria. Además como utilizamos el mismo gestionador de memoria de COM, el cual está gestionado por Windows no creo que esto vuelva a dar problemas aunque haya más actualizaciones y la información de las fuentes se vuelva a triplicar. Por cierto, en el módulo 'pdfobjs.pas' aparece otra llamada a 'GetFontData' en el procedimiento AnalyseTTFOnt, bajando hacia la línia 728 podemos encontrar de nuevo la sentencia SetLength(buff,fsize), justo antes de la llamada a GetFontData os recomiendo que hagais el mismo proceso en este módulo y la cambiéis por CoTaskMalloc. Aseguraros que liberáis la memoria alojada por CoTaskMalloc con CoTaskMemFree en un bloque finally que tendreis que añadir expresamente al final de 'AnalyseTtFont' . Yo lo he puesto despues de la sentencia
Última edición por REPUSOFT fecha: 30-09-2018 a las 13:37:40. |
#33
|
|||
|
|||
Hola Ginobili20 y gracias por tu respuesta, la cual me ha ayudado mucho para encontrar la verdadera causa del problema.
Aunque el código que das aparentemente funciona no es la solución correcta porque el desbordamiento del buffer se produce ya cuando vuelves de SetLength(). Tu código funciona porque pones el cuerpo de las funciones 'inline' y por tanto no hace falta utilizar el stack para pasar el buffer desbordado a las funciones pero el desbordamiento ya está latente. Saludos y gracias de nuevo a tí y a todos los miembros del foro |
#34
|
|||
|
|||
Rectificación del título
El título del mensaje debería decir "Solución al problema de de desbordamiento de QReports al general PDF´s" Perdonad!
|
#35
|
||||
|
||||
Cita:
Gracias
__________________
Ya tengo Firma! |
#36
|
|||
|
|||
Cita:
|
#37
|
|||
|
|||
Cita:
hola no se español, Como solución al problema, el número de código 1628 de mi archivo también se ve diferente. No entendí completamente la solución. 1628 on my file: Código:
WriteStr(Format('/FontBBox [ %-d %-d %-d %-d ]', [PDFFont.BBox[0], PDFFont.BBox[1], PDFFont.BBox[2], PDFFont.BBox[3]])); Te lo ruego, por favor. |
#38
|
|||
|
|||
Thank you very much REPUSOFT
|
#39
|
||||
|
||||
Hola REPUSOFT,
Aunque el pos es muy antiguo, mas antiguos es la versión con la que estoy trabajando Delphi 7 y, a la hora de exportar a PDF con el "TQRPDFDocumentFilter" (QuickReport 4), me petaba, ahora con la solución que distes en su día, lo he probado y funciona correctamente y sin ningún problema. Muchas gracias Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber. |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
QReport con Win10 | inetplus | Impresión | 3 | 13-08-2018 20:37:25 |
desbordamiento de pila | danielmj | Varios | 4 | 30-10-2016 20:27:48 |
Como saber si un problema esta SOLUCIONADO | cloayza | La Taberna | 16 | 24-02-2010 16:30:10 |
Desbordamiento de pila | ecfisa | OOP | 2 | 06-12-2007 16:08:35 |
Desbordamiento de Pila | Durbed | Conexión con bases de datos | 5 | 21-06-2006 20:05:31 |
![]() |
|