2009-09-26 8 views
7

necesito para parchear un método en el Classes.pascómo parchear un método en el Classes.pas

(TReader.ReadString - quiero forzarlo a utilizar una página de códigos especificada, no el defecto del sistema).

Si copio Classes.pas en mi proyecto, terminaré teniendo que reconstruir todo el VCL. ¿Hay alguna forma (fácil) de parchar un método en tiempo de ejecución?

+1

¿Está seguro de que no hay un enfoque basado en la configuración para lograr lo que necesita? Aplicar parches a classes.pas debería ser realmente su ÚLTIMO recurso ... –

+0

Sí, hay un enfoque basado en configuración: ¡cambiar la configuración regional para todo el sistema! El problema es que D2009 no parece ser totalmente Unicode (creo que los DFM aún contienen AnsiStrings). Quiero poder cargar diferentes dll de recursos (inglés/japonés/chino/coreano) en una sola máquina, * sin * cambiar la configuración regional del sistema –

+1

Los DFM se procesan como UTF8, que yo sepa. –

Respuesta

19

Modificar el lado de implementación de Classes.pas no requerirá volver a compilar todo. Delphi se da cuenta de si una unidad tiene que volver a compilar por un algoritmo que se ve más o menos así:

  • Si DCU encontró:
    • es el formato DCU fuera de fecha (versión antigua del compilador)? Si es así, necesita una fuente para volver a compilar o un error de tiempo de compilación.
    • ¿La fuente está en la ruta? Si es así, si es más reciente que la DCU, recompilar
    • Para cada unidad utilizada:
      • Repetir el análisis al cargar
      • Para cada símbolo que se utiliza ("importación": tipo, variable, de rutina, inicializado constante etc.) desde esa unidad:
        • ¿Hay símbolo de la versión de importación diferente al símbolo encontrado en la unidad usada? Si es así, recompile necesario.
  • Si no se encuentra DCU, tendrá que ser encontrado y compilado fuente, de lo contrario el tiempo de compilación de error

El concepto importante es el de símbolo versión. Al guardar una DCU, Delphi calcula un hash basado en la declaración de interfaz del símbolo y lo asocia con el símbolo. Otras unidades que usan el símbolo también almacenan la versión del símbolo. De esta forma, se evitan los conflictos de tiempo de enlace causados ​​por símbolos obsoletos, a diferencia de la mayoría de los vinculadores de C.

El resultado de esto es que usted debe ser capaz de añadir Classes.pas a su proyecto y modificar su sección aplicación casi al contenido de su corazón, y aún así ser capaz de estáticamente enlace con el resto de la RTL y VCL y bibliotecas de terceros, incluso aquellas provistas solo en formato de objeto.

Cosas que tener cuidado de:

  • rutinas inline; el cuerpo de las rutinas incluidas es parte de la versión del símbolo
  • Genéricos; el lado de la aplicación de tipos y métodos genéricos son parte de las respectivas versiones de símbolos
+0

+1 Buena respuesta;) – RRUZ

+0

Además, debe cambiar una copia de Classes.pas y agregar al proyecto, evitando problemas de actualizaciones. –

+0

OK, tomé una copia de Classes.pas y la agregué a mi proyecto. No se pudo compilar debido a problemas con la versión del símbolo como se describió anteriormente. Intenté configurar todas las opciones del compilador según la pregunta "Unidad VCL de D2009 que no se compilará" sin alegría. Como iba a necesitar modificar la interfaz pública de todos modos, no proseguí con esto. –

Cuestiones relacionadas