La adición de la información de la versión de las aplicaciones


Este artículo voy a investigar el medio por el cual la información de la versión pueden estar disponibles dentro de una aplicación, escribir una clase que puede ser incorporado en cualquier nuevo desarrollo.
la Adición de la Información de la Versión Para Aplicaciones
el Último artículo que he analizado el concepto de una generación, y por qué un estándar de proceso para producir un conjunto consistente de los productos era una buena cosa.
Desde los primeros programas de ordenador se desplegaron, los desarrolladores querían tener alguna manera de identificar la versión de que un cliente se ejecuta después de todo, es, obviamente, vale la pena saber si es un bug que está la presentación ya ha sido corregido. Con bastante rapidez (y obviamente) un sistema numérico evolucionado, simplemente incrementando el número de versión cada vez que un lanzamiento se hizo. Como la frecuencia de los lanzamientos de mayor, los desarrolladores querían tener alguna manera de distinguir una nueva versión, en comparación con una provisional: el concepto de versiones principales y secundarias de un programa se introdujo va de V1.12 a V2.0 transmitió mucho más (incluso a los laicos de los usuarios) que va desde la V12 a la V13. Durante muchos años la versión principal y secundaria era el adecuado y normal, pero como de los programas que se hizo más grande y complejo que requiere más frecuentes correcciones terciario número fue agregado a la final de la versión para indicar una 'liberación'. Todas las versiones con la misma versión principal y secundaria números deben tener idéntica a la lista de características, pero debe incluir acumulada correcciones de errores y otras mejoras sin la adición de nuevas características como tal. Últimamente, se ha convertido en una buena práctica para anexar el número de compilación de la versión causando un número de versión con cuatro componentes, X. Y. Z. B, donde X representa la versión principal, Y el menor de la versión, Z el número de versión y B el número de compilación. Tenga en cuenta que aunque el menor y la liberación de versiones se pueden restablecer a cero (con mayor y menor versiones), el número de compilación nunca se restablece y por lo tanto siempre aumenta con cada nueva versión (aunque no necesariamente estrictamente incremental es muy posible que haya interno se construye dentro de una compañía que no se entregan a los clientes). Listado 1 se resumen cuando cada número de la versión del componente debe ser incrementado.





ComponenteDescribeCuando el Incremento De la
XDespués de que se han hecho cambios significativos a la aplicación
YMenorDespués de que se han añadido nuevas funciones a la aplicación
ZVersiónCada vez que un menor de liberación está disponible con las correcciones de errores
BCrearCada vez que finaliza el proceso de generación


Listado 1 - Componentes de número de versión X. Y. Z. B
a Pesar de que los departamentos de marketing secuestrado el concepto de los números de versión para sus propios fines, una vez que se dio cuenta de que un gran número de personas podría invertir en actualizaciones cuando el número de versión principal cambiado o se saltaba la competencia, todavía es muy útil tener algún tipo de un oficial de la versión número en sus aplicaciones, es mucho más fácil para confirmar que el cliente se está ejecutando Construir 134 o más tarde, en lugar de 'SuperApp 97 SR-2a Parche 13 (Y2K)'. Esto se hizo particularmente importante con el advenimiento de archivo DLL compartido de bibliotecas dentro de Windows que podría ser sustituido por un recién instalada la aplicación. Aunque no muy buenos usando el esquema de numeración constantemente, prácticamente todos los de Microsoft los archivos de la aplicación (EXE y DLL) que contengan algún tipo de 4 dígitos de su número de versión incrustada dentro de ellos. De hecho, Windows 2000 hace un amplio uso de esta información en un intento de evitar que los archivos importantes del sistema que se sobrescriban anteriores, o a veces más tarde, las versiones. Los procedimientos de instalación también hacer uso de esta información por parte de advertencia cuando un archivo se sobrescribirá un nombre similar pero más tarde la versión de sí mismo.
Embebido Información de la Versión
Si hace clic derecho en un archivo EXE o DLL archivos en el Explorador en el menú emergente que aparece tiene una entrada en la parte inferior llamado 'Propiedades'. La selección de esta muestra algunos detalles sobre el archivo. Si está disponible, la segunda ficha (Versión) muestra la información incrustada en el archivo sobre el número de versión, nombre del producto, los detalles de copyright y así sucesivamente. Cualquier archivo que puede tener un recurso segmento puede tener esta información incrustada dentro de ella, y esto incluye las aplicaciones compiladas con Delphi. Microsoft ha publicado la información y el formato que debe ser proporcionada en la sección de recursos para que esta información se muestre. En Delphi 2, la única manera de que esto podría lograrse fue mediante la creación de un archivo de recursos con exactamente el derecho cadenas dentro de ella, de su compilación por separado con el compilador de recursos y, a continuación, vincular a la aplicación (esta formando parte de los principales proceso de construcción). Aunque no es difícil, estos pasos se requiere un nivel de conocimiento técnico y de competencia tal que algunos de los desarrolladores de aplicaciones se molestó en hacerlo. Dentro de su filosofía de hacer de Windows en desarrollo más productivo, Delphi 3 introdujo un diálogo especial por el cual esta información puede ser fácilmente conectado a la aplicación. La figura 1 muestra este cuadro de diálogo, disponible desde el Delphi menú Proyecto, elemento Opciones.
activando la casilla de verificación en la parte superior de la pestaña para mostrar que el número de versión debe incluirse información es posible añadir los detalles acerca de no sólo el número de versión, pero también banderas acerca de si la construcción está previsto para su divulgación pública, y en la parte inferior es posible añadir detalles a toda una lista de categorías predefinidas, tales como una descripción de los archivos y los derechos de autor. Delphi automáticamente los cambios de la FileVersion categoría como el módulo de número de la versión de los detalles anteriores se actualizan. Cuando este cuadro de diálogo se confirma, Delphi construcciones de los recursos necesarios archivo (que también contiene detalles tales como el icono de la aplicación) en una medida transparente, que se vinculará automáticamente en el ejecutable final. Si usted hace esto, incluso el más simple proyecto, usted verá que usted puede ahora haga clic derecho sobre el ejecutable y obtener información de versión, al igual que todo buen comportamiento de las aplicaciones de Windows.
¿Qué Versión de yo Soy?
Ahora que sabemos cómo colocar la información de la versión dentro de la aplicación, sería útil para obtener acceso a la información. Después de todo, si usted está tratando de establecer a través del teléfono ¿qué versión de un usuario ejecuta sería mucho más fácil describir cómo mostrar el cuadro de diálogo Acerca de, en lugar de encontrar el ejecutable de la aplicación en el Explorador, haga clic derecho, seleccione Propiedades y seleccionando la ficha Versión.
Como la información de versión es sólo almacenan como cadenas en un formato específico en la sección de recursos de la aplicación, sería posible utilizar el estándar de recursos Win32 archivo de comandos para extraer la información relevante, la decodificación de las estructuras. Sin embargo, hay algunas específicas de la API de Win32 comandos disponibles que hacer esto en una forma más conveniente. Estos son GetFileVersionInfoSize (que devuelve datos sobre el espacio requerido para almacenar la información de la versión), GetFileVersionInfo (que se extrae de los detalles dentro de un nucleo de amortiguamiento de la talla correcta), y VerQueryValue (que se extrae un pedazo de información de la versión del búfer, tales como 'LegalCopyright'). Como de costumbre, a la hora de interactuar con la API de Win32, estos comandos deben ser llamados en la secuencia correcta, la preservación de ciertos valores internos regresaron de comandos anteriores a través de parámetros var.
es una muy buena idea para encapsular cualquier tipo de interacción con la API de Windows con un usuario más y Delphi-interfaz amigable. Típico de los programadores de Delphi no quiere lidiar con la asignación de bloques de memoria y de Win32-tipos específicos tales como DWORD y UINT, y tampoco deben. Mucho mejor el diseño de una clase de niza que, en la mejor tradición de la OO, se esconde la cruda acceso a la información de la versión y presenta una mucho más utilizable de la interfaz. Esto tiene la ventaja añadida de que si en el almacenamiento de esta información de la versión de cambiar siempre, a la misma clase pueden encapsular las dependencias del sistema manteniendo la misma interfaz pública.
Hay un par de cosas a tener en cuenta a la hora de diseñar esta clase. En primer lugar, debe ser capaz de ser utilizado con cualquier archivo de la aplicación, incluida la de que se está ejecutando. En segundo lugar, se debe proporcionar un acceso adecuado a la norma y el más utilizado información de la versión de teclas (FileVersion, ProductName etc.). Por último, como es posible que el usuario adicionales de la versión personalizada de claves y valores dentro de su estructura, la clase debe exponer a estos de una manera natural. Listado 2 muestra la interfaz pública de la clase.
TVersionInfo = clase
privada
& nbsp & nbsp función GetVersionInfo (Index: Integer): String
público
& nbsp & nbsp constructor Create (ThisSourceFile: String)
& nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp // clave Arbitraria de información
& nbsp & nbsp Clave de propiedad de[nombre de Clave: String]: Cadena de leer GetKey
& nbsp & nbsp // Estándar de información clave
& nbsp & nbsp propiedad CompanyName: índice de Cadena 0 leer GetVersionInfo
& nbsp & nbsp & nbsp & nbsp escribir SetVersionInfo
& nbsp & nbsp propiedad FileDescription: índice de Cadena 1 leer GetVersionInfo
& nbsp & nbsp propiedad FileVersion: índice de Cadena 2 leer GetVersionInfo
& nbsp & nbsp propiedad InternalName: Índice de cadena 3 leer GetVersionInfo
& nbsp & nbsp propiedad de derechos de Autor: índice de Cadena 4 leer GetVersionInfo
& nbsp & nbsp propiedad de las Marcas: índice de Cadena 5 leer GetVersionInfo
& nbsp & nbsp propiedad OriginalFileName: índice de Cadena 6 leer GetVersionInfo
& nbsp & nbsp propiedad ProductName: índice de Cadena 7 leer GetVersionInfo
& nbsp & nbsp & nbsp & nbsp escribir SetVersionInfo
& nbsp & nbsp propiedad ProductVersion: Índice de cadena 8 leer GetVersionInfo
& nbsp & nbsp & nbsp & nbsp escribir SetVersionInfo
& nbsp & nbsp propiedad Comentario: índice de Cadena 9 leer GetVersionInfo
& nbsp & nbsp de la propiedad número de compilación: Cadena de leer GetBuildNumber
fin
Listado 2 - interfaz Pública de TVersionInfo

Como se puede ver en la clase, todas las teclas estándar, los nombres se exponen como propiedades con nombre, mientras la Llave de la propiedad proporciona acceso a la costumbre información adicional por su nombre. La clase se construye por la que pasa una ruta de acceso completa y el nombre de archivo de la versión que la información debe ser extraída. Hay un aspecto muy interesante acerca de esta clase, que demuestra que un infrautilizado aspecto de Delphi de la clase de diseño: usando el índice identificador para asignar un número de propiedades diferentes en el mismo descriptor de acceso de la función. Como puede verse a partir de la aplicación privada de GetVersionInfo utiliza para leer las propiedades, este valor del índice se aprobó en función de la propiedad se accede, lo que permite la función para determinar el valor a devolver. Como veremos en la aplicación, esto a menudo facilita muy concisa de codificación.
Como se mencionó anteriormente, el GetFileVersionInfo comando extrae los datos de la sección de recursos y los almacena en el buffer que se pasa como parámetro a la llamada a la API. Por lo tanto, tiene sentido para realizar esto como una operación puntual en el constructor. Una vez que esta información ha sido extraída, podemos interrogar por conocidos nombres de claves. Conveniente para la codificación y un aumento en el rendimiento, vamos a extraer los valores de la clave de todas las claves de estándar de nombres y almacenar estos valores en una matriz con el mismo valor ordinal como cada uno de los índice de propiedad. Estos significa que la aplicación de la GetVersionInfo descriptor de acceso de propiedad de la función puede ser de forma transparente sencillo y simplemente devuelve el valor de matriz en el adaptador de índice. De la costumbre de las claves que podrían además ser proporcionada simplemente tendremos que llamar a la API de comando para extraer los detalles de la información de la versión del búfer. Aunque esto será un poco más lento que el acceso a los detalles directa de un pre-calculado de la matriz, no se anticipa que estas propiedades se accede con frecuencia, y este es, por tanto, de un diseño aceptable decisión. El listado 3 muestra la implementación de la clase.
constructor TVersionInfo.Crear (ThisSourceFile: String)
const
& nbsp & nbsp VersionKeyNames: array [0..MaxVersionKeys] of String =
& nbsp & nbsp & nbsp ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName',
& nbsp & nbsp & nbsp & nbsp 'LegalCopyright', 'LegalTrademarks', 'OriginalFilename',
& nbsp & nbsp & nbsp & nbsp 'Producto', 'ProductVersion', 'Comentarios')
var
& nbsp & nbsp ThisInfo: Integer
& nbsp & nbsp InfoLength: UINT
& nbsp & nbsp Len: DWORD
& nbsp & nbsp Mango: DWORD
& nbsp & nbsp PCharset: PLongInt
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp // Obtiene el tamaño de la información de versión de
& nbsp & nbsp Len := GetFileVersionInfoSize (PChar (ThisSourceFile), Mango)
& nbsp & nbsp // Asignar VersionInfo tamaño de búfer
& nbsp & nbsp SetLength (VersionInfo, Len 1)
& nbsp & nbsp // Obtener información de la versión
& nbsp & nbsp si GetFileVersionInfo (PChar(ThisSourceFile), Mango, Len,
& nbsp & nbsp & nbsp & nbsp Puntero(VersionInfo)) entonces
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp // Obtener la traducción info para los Idiomas / CharSet Id
& nbsp & nbsp & nbsp & nbsp si VerQueryValue(PointerVersionInfo), '/VarFileInfo/Traducción',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Puntero(PCharset), InfoLength), a continuación,
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp LangCharset := Format ('%.4x%.4x',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp [LoWord (PCharset^), HiWord (PCharset^)])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp InfoAvailable := True
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Obtener la versión estándar de la información
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp para ThisInfo := 0 a MaxVersionKeys hacer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp StandardKeys[ThisInfo] :=
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetKey(VersionKeyNames[ThisInfo])
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
fin
función TVersionInfo.GetKey (ThisKeyName: string): string
var
& nbsp & nbsp InfoLength: UINT
begin
& nbsp & nbsp si InfoAvailable, a continuación,
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp SetLength (Resultado, 255)
& nbsp & nbsp & nbsp & nbsp si VerQueryValue (Puntero(VersionInfo),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar(Format('/StringFileInfo/%s/%s',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp [LangCharset, ThisKeyName])), Indicador(Resultado),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp InfoLength) a continuación,
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SetString(Resultado, PChar(Resultado), InfoLength - 1)
& nbsp & nbsp & nbsp & nbsp end else
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := '
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp end else
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := 'N/A'
& nbsp & nbsp final
fin
función TVersionInfo.GetVersionInfo(Index: Integer): string
begin
& nbsp & nbsp Resultado := StandardKeys[Índice]
fin
procedimiento TVersionInfo.SetVersionInfo(Index: Integer
& nbsp & nbsp Valor: string)
begin
& nbsp & nbsp StandardKeys[Índice] := Valor
fin
función TVersionInfo.GetBuildNumber: string
begin
& nbsp & nbsp // Tira el último elemento de la versión del archivo
& nbsp & nbsp Resultado := FileVersion
& nbsp & nbsp mientras Pos ('.', Resultado) > 0 hacer
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := Copy (Resultado, Pos ('.', Resultado) 1, Length(Resultado))
& nbsp & nbsp final
fin
Uno de los matices de la forma en que la información de la versión almacenada en la aplicación de recursos de la sección es que es posible definir qué conjunto de caracteres del lenguaje ha sido utilizado para crear la información de versión (y la aplicación o DLL). Este se define dentro de la información de versión como una palabra doble, o de 32 bits entero sin signo, y debe estar presente como parte de la información de la versión de la cadena (en formato hexadecimal) para cada una de las claves que se extraen. Uno de los trabajos de la constructora, así como la extracción de la información de versión en un búfer de cadena (una forma conveniente de almacenar estática datos devueltos por las llamadas a la API) es extraer el idioma y el juego de caracteres de la información y construir una correcta cadena hexadecimal que se utilizará en el futuro llama a VerQueryValue. Una vez hecho esto el constructor, a continuación, hace una llamada a la rutina que devuelve realmente una versión de el valor de la información para una llave de serie. Esta rutina vive una doble vida, además que disfraza la función de descriptor de acceso de la Llave de la propiedad. De nuevo, un aspecto interesante de este proceso es que el constructor obtiene una lista de los estándar de los nombres clave de un privado constante de cadena fija de la matriz que se declara y define en una sola instrucción. Esto también es un poco usada, pero muy útil, técnica que también es permitido para las variables globales, así como constantes.
Si usted se refiere de nuevo a la Figura 1 se puede ver algo más de información de control de versiones en el grupo llamado 'Módulo de atributos', principalmente un conjunto de indicadores que describen el estado de la aplicación, si se trata de una depuración o privado a construir y así sucesivamente. Esta información también está disponible en el archivo de recursos, y se puede acceder utilizando la API VerQueryValue comando, pero con un segundo parámetro de sólo '/', en lugar de '/VarFileInfo/Traducción'. En esta instancia, lo que se devuelve es un puntero a una estructura que contiene detalles acerca del tipo de archivo y el contenido, haga doble pares de palabras que pueden ser combinados para representar una estricta versión de 64 bits de número que se utiliza para la estricta comparaciones numéricas (por los programas de instalación), así como el Módulo de atributos definibles dentro de Delphi. Sería una tarea sencilla para extender la TVersionInfo constructor para extraer esta información y exponerlo a través de simples propiedades Booleanas y, en Delphi 5, Int64 tipos de propiedad para la versión estricta de los números.
Esta capacidad para encapsular el acceso a estructuras de datos complejas a través de una cómoda interfaz es una de las bellezas de la Orientación a Objetos, y a la que vamos a estar volviendo continuamente. La clase definida aquí ya ha expuesto el número de compilación como propiedad separada, que a su vez deriva del último elemento de FileVersion para proporcionar a los usuarios de la clase con los datos de la manera más conveniente. Por ejemplo, un uso apropiado de esto sería en el cuadro Acerca de una aplicación, mostrando no sólo el nombre de la aplicación y los detalles de copyright, sino también la versión del programa y el número de compilación para una fácil referencia.
Para completar nuestro examen de un proceso de construcción sería muy bonito si, después de haber completado con éxito, se podría incrementar el número de compilación (y posiblemente el número de versión) dentro de la información de versión de todos los entregables. Delphi aparece para almacenar esta información de la versión dentro de la .DOF archivo que acompaña al proyecto, este es en formato de archivo INI y contiene la mayoría de los detalles expuestos por el Proyecto | Opciones de diálogo. Sin embargo, mediante programación de hacer cambios a este archivo (no hay entradas en la [Información de Versión] de la sección para cosas como MajorVer, Liberación y así sucesivamente) no es realmente el resultado de los cambios a la aplicación compilada. Esto es debido a que Delphi genera el archivo de recursos compilado (Proyecto.RES) a partir de esta información únicamente cuando se cambia de forma interactiva desde dentro mismo Delphi. El .RES compilado archivo de recursos es simplemente vinculado a la aplicación en tiempo de compilación, por lo que la realización de cambios a la .DOF archivo y, a continuación, volver a compilar la aplicación no causa el archivo de recursos para ser regenerado y la fecha de salida de uno es usado. Es una buena práctica, por tanto, la actualización de la acumulación y la liberación de los números de Delphi de cada proyecto con la mano al final de cada generación correcta.
En el siguiente artículo vamos a empezar a diseñar las clases que vamos a necesitar para producir un verdaderamente orientado a objetos de la aplicación, la encapsulación de los objetos de negocio y acceso a bases de datos en un altamente productiva. Este será un gran odisea que cubren casi todos los aspectos del desarrollo de aplicaciones Windows.
el Siguiente en la serie









La adicion de la informacion de la version de las aplicaciones


La adicion de la informacion de la version de las aplicaciones : Multi-millones de consejos para hacer su vida mas facil.


Este articulo voy a investigar el medio por el cual la informacion de la version pueden estar disponibles dentro de una aplicacion, escribir una clase que puede ser incorporado en cualquier nuevo desarrollo.
la Adicion de la Informacion de la Version Para Aplicaciones
el Ultimo articulo que he analizado el concepto de una generacion, y por que un estandar de proceso para producir un conjunto consistente de los productos era una buena cosa.
Desde los primeros programas de ordenador se desplegaron, los desarrolladores querian tener alguna manera de identificar la version de que un cliente se ejecuta despues de todo, es, obviamente, vale la pena saber si es un bug que esta la presentacion ya ha sido corregido. Con bastante rapidez (y obviamente) un sistema numerico evolucionado, simplemente incrementando el numero de version cada vez que un lanzamiento se hizo. Como la frecuencia de los lanzamientos de mayor, los desarrolladores querian tener alguna manera de distinguir una nueva version, en comparacion con una provisional: el concepto de versiones principales y secundarias de un programa se introdujo va de V1.12 a V2.0 transmitio mucho mas (incluso a los laicos de los usuarios) que va desde la V12 a la V13. Durante muchos años la version principal y secundaria era el adecuado y normal, pero como de los programas que se hizo mas grande y complejo que requiere mas frecuentes correcciones terciario numero fue agregado a la final de la version para indicar una 'liberacion'. Todas las versiones con la misma version principal y secundaria numeros deben tener identica a la lista de caracteristicas, pero debe incluir acumulada correcciones de errores y otras mejoras sin la adicion de nuevas caracteristicas como tal. Ultimamente, se ha convertido en una buena practica para anexar el numero de compilacion de la version causando un numero de version con cuatro componentes, X. Y. Z. B, donde X representa la version principal, Y el menor de la version, Z el numero de version y B el numero de compilacion. Tenga en cuenta que aunque el menor y la liberacion de versiones se pueden restablecer a cero (con mayor y menor versiones), el numero de compilacion nunca se restablece y por lo tanto siempre aumenta con cada nueva version (aunque no necesariamente estrictamente incremental es muy posible que haya interno se construye dentro de una compañia que no se entregan a los clientes). Listado 1 se resumen cuando cada numero de la version del componente debe ser incrementado.





ComponenteDescribeCuando el Incremento De la
XDespues de que se han hecho cambios significativos a la aplicacion
YMenorDespues de que se han añadido nuevas funciones a la aplicacion
ZVersionCada vez que un menor de liberacion esta disponible con las correcciones de errores
BCrearCada vez que finaliza el proceso de generacion


Listado 1 - Componentes de numero de version X. Y. Z. B
a Pesar de que los departamentos de marketing secuestrado el concepto de los numeros de version para sus propios fines, una vez que se dio cuenta de que un gran numero de personas podria invertir en actualizaciones cuando el numero de version principal cambiado o se saltaba la competencia, todavia es muy util tener algun tipo de un oficial de la version numero en sus aplicaciones, es mucho mas facil para confirmar que el cliente se esta ejecutando Construir 134 o mas tarde, en lugar de 'SuperApp 97 SR-2a Parche 13 (Y2K)'. Esto se hizo particularmente importante con el advenimiento de archivo DLL compartido de bibliotecas dentro de Windows que podria ser sustituido por un recien instalada la aplicacion. Aunque no muy buenos usando el esquema de numeracion constantemente, practicamente todos los de Microsoft los archivos de la aplicacion (EXE y DLL) que contengan algun tipo de 4 digitos de su numero de version incrustada dentro de ellos. De hecho, Windows 2000 hace un amplio uso de esta informacion en un intento de evitar que los archivos importantes del sistema que se sobrescriban anteriores, o a veces mas tarde, las versiones. Los procedimientos de instalacion tambien hacer uso de esta informacion por parte de advertencia cuando un archivo se sobrescribira un nombre similar pero mas tarde la version de si mismo.
Embebido Informacion de la Version
Si hace clic derecho en un archivo EXE o DLL archivos en el Explorador en el menu emergente que aparece tiene una entrada en la parte inferior llamado 'Propiedades'. La seleccion de esta muestra algunos detalles sobre el archivo. Si esta disponible, la segunda ficha (Version) muestra la informacion incrustada en el archivo sobre el numero de version, nombre del producto, los detalles de copyright y asi sucesivamente. Cualquier archivo que puede tener un recurso segmento puede tener esta informacion incrustada dentro de ella, y esto incluye las aplicaciones compiladas con Delphi. Microsoft ha publicado la informacion y el formato que debe ser proporcionada en la seccion de recursos para que esta informacion se muestre. En Delphi 2, la unica manera de que esto podria lograrse fue mediante la creacion de un archivo de recursos con exactamente el derecho cadenas dentro de ella, de su compilacion por separado con el compilador de recursos y, a continuacion, vincular a la aplicacion (esta formando parte de los principales proceso de construccion). Aunque no es dificil, estos pasos se requiere un nivel de conocimiento tecnico y de competencia tal que algunos de los desarrolladores de aplicaciones se molesto en hacerlo. Dentro de su filosofia de hacer de Windows en desarrollo mas productivo, Delphi 3 introdujo un dialogo especial por el cual esta informacion puede ser facilmente conectado a la aplicacion. La figura 1 muestra este cuadro de dialogo, disponible desde el Delphi menu Proyecto, elemento Opciones.
activando la casilla de verificacion en la parte superior de la pestaña para mostrar que el numero de version debe incluirse informacion es posible añadir los detalles acerca de no solo el numero de version, pero tambien banderas acerca de si la construccion esta previsto para su divulgacion publica, y en la parte inferior es posible añadir detalles a toda una lista de categorias predefinidas, tales como una descripcion de los archivos y los derechos de autor. Delphi automaticamente los cambios de la FileVersion categoria como el modulo de numero de la version de los detalles anteriores se actualizan. Cuando este cuadro de dialogo se confirma, Delphi construcciones de los recursos necesarios archivo (que tambien contiene detalles tales como el icono de la aplicacion) en una medida transparente, que se vinculara automaticamente en el ejecutable final. Si usted hace esto, incluso el mas simple proyecto, usted vera que usted puede ahora haga clic derecho sobre el ejecutable y obtener informacion de version, al igual que todo buen comportamiento de las aplicaciones de Windows.
¿Que Version de yo Soy?
Ahora que sabemos como colocar la informacion de la version dentro de la aplicacion, seria util para obtener acceso a la informacion. Despues de todo, si usted esta tratando de establecer a traves del telefono ¿que version de un usuario ejecuta seria mucho mas facil describir como mostrar el cuadro de dialogo Acerca de, en lugar de encontrar el ejecutable de la aplicacion en el Explorador, haga clic derecho, seleccione Propiedades y seleccionando la ficha Version.
Como la informacion de version es solo almacenan como cadenas en un formato especifico en la seccion de recursos de la aplicacion, seria posible utilizar el estandar de recursos Win32 archivo de comandos para extraer la informacion relevante, la decodificacion de las estructuras. Sin embargo, hay algunas especificas de la API de Win32 comandos disponibles que hacer esto en una forma mas conveniente. Estos son GetFileVersionInfoSize (que devuelve datos sobre el espacio requerido para almacenar la informacion de la version), GetFileVersionInfo (que se extrae de los detalles dentro de un nucleo de amortiguamiento de la talla correcta), y VerQueryValue (que se extrae un pedazo de informacion de la version del bufer, tales como 'LegalCopyright'). Como de costumbre, a la hora de interactuar con la API de Win32, estos comandos deben ser llamados en la secuencia correcta, la preservacion de ciertos valores internos regresaron de comandos anteriores a traves de parametros var.
es una muy buena idea para encapsular cualquier tipo de interaccion con la API de Windows con un usuario mas y Delphi-interfaz amigable. Tipico de los programadores de Delphi no quiere lidiar con la asignacion de bloques de memoria y de Win32-tipos especificos tales como DWORD y UINT, y tampoco deben. Mucho mejor el diseño de una clase de niza que, en la mejor tradicion de la OO, se esconde la cruda acceso a la informacion de la version y presenta una mucho mas utilizable de la interfaz. Esto tiene la ventaja añadida de que si en el almacenamiento de esta informacion de la version de cambiar siempre, a la misma clase pueden encapsular las dependencias del sistema manteniendo la misma interfaz publica.
Hay un par de cosas a tener en cuenta a la hora de diseñar esta clase. En primer lugar, debe ser capaz de ser utilizado con cualquier archivo de la aplicacion, incluida la de que se esta ejecutando. En segundo lugar, se debe proporcionar un acceso adecuado a la norma y el mas utilizado informacion de la version de teclas (FileVersion, ProductName etc.). Por ultimo, como es posible que el usuario adicionales de la version personalizada de claves y valores dentro de su estructura, la clase debe exponer a estos de una manera natural. Listado 2 muestra la interfaz publica de la clase.
TVersionInfo = clase
privada
& nbsp & nbsp funcion GetVersionInfo (Index: Integer): String
publico
& nbsp & nbsp constructor Create (ThisSourceFile: String)
& nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp // clave Arbitraria de informacion
& nbsp & nbsp Clave de propiedad de[nombre de Clave: String]: Cadena de leer GetKey
& nbsp & nbsp // Estandar de informacion clave
& nbsp & nbsp propiedad CompanyName: indice de Cadena 0 leer GetVersionInfo
& nbsp & nbsp & nbsp & nbsp escribir SetVersionInfo
& nbsp & nbsp propiedad FileDescription: indice de Cadena 1 leer GetVersionInfo
& nbsp & nbsp propiedad FileVersion: indice de Cadena 2 leer GetVersionInfo
& nbsp & nbsp propiedad InternalName: Indice de cadena 3 leer GetVersionInfo
& nbsp & nbsp propiedad de derechos de Autor: indice de Cadena 4 leer GetVersionInfo
& nbsp & nbsp propiedad de las Marcas: indice de Cadena 5 leer GetVersionInfo
& nbsp & nbsp propiedad OriginalFileName: indice de Cadena 6 leer GetVersionInfo
& nbsp & nbsp propiedad ProductName: indice de Cadena 7 leer GetVersionInfo
& nbsp & nbsp & nbsp & nbsp escribir SetVersionInfo
& nbsp & nbsp propiedad ProductVersion: Indice de cadena 8 leer GetVersionInfo
& nbsp & nbsp & nbsp & nbsp escribir SetVersionInfo
& nbsp & nbsp propiedad Comentario: indice de Cadena 9 leer GetVersionInfo
& nbsp & nbsp de la propiedad numero de compilacion: Cadena de leer GetBuildNumber
fin
Listado 2 - interfaz Publica de TVersionInfo

Como se puede ver en la clase, todas las teclas estandar, los nombres se exponen como propiedades con nombre, mientras la Llave de la propiedad proporciona acceso a la costumbre informacion adicional por su nombre. La clase se construye por la que pasa una ruta de acceso completa y el nombre de archivo de la version que la informacion debe ser extraida. Hay un aspecto muy interesante acerca de esta clase, que demuestra que un infrautilizado aspecto de Delphi de la clase de diseño: usando el indice identificador para asignar un numero de propiedades diferentes en el mismo descriptor de acceso de la funcion. Como puede verse a partir de la aplicacion privada de GetVersionInfo utiliza para leer las propiedades, este valor del indice se aprobo en funcion de la propiedad se accede, lo que permite la funcion para determinar el valor a devolver. Como veremos en la aplicacion, esto a menudo facilita muy concisa de codificacion.
Como se menciono anteriormente, el GetFileVersionInfo comando extrae los datos de la seccion de recursos y los almacena en el buffer que se pasa como parametro a la llamada a la API. Por lo tanto, tiene sentido para realizar esto como una operacion puntual en el constructor. Una vez que esta informacion ha sido extraida, podemos interrogar por conocidos nombres de claves. Conveniente para la codificacion y un aumento en el rendimiento, vamos a extraer los valores de la clave de todas las claves de estandar de nombres y almacenar estos valores en una matriz con el mismo valor ordinal como cada uno de los indice de propiedad. Estos significa que la aplicacion de la GetVersionInfo descriptor de acceso de propiedad de la funcion puede ser de forma transparente sencillo y simplemente devuelve el valor de matriz en el adaptador de indice. De la costumbre de las claves que podrian ademas ser proporcionada simplemente tendremos que llamar a la API de comando para extraer los detalles de la informacion de la version del bufer. Aunque esto sera un poco mas lento que el acceso a los detalles directa de un pre-calculado de la matriz, no se anticipa que estas propiedades se accede con frecuencia, y este es, por tanto, de un diseño aceptable decision. El listado 3 muestra la implementacion de la clase.
constructor TVersionInfo.Crear (ThisSourceFile: String)
const
& nbsp & nbsp VersionKeyNames: array [0..MaxVersionKeys] of String =
& nbsp & nbsp & nbsp ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName',
& nbsp & nbsp & nbsp & nbsp 'LegalCopyright', 'LegalTrademarks', 'OriginalFilename',
& nbsp & nbsp & nbsp & nbsp 'Producto', 'ProductVersion', 'Comentarios')
var
& nbsp & nbsp ThisInfo: Integer
& nbsp & nbsp InfoLength: UINT
& nbsp & nbsp Len: DWORD
& nbsp & nbsp Mango: DWORD
& nbsp & nbsp PCharset: PLongInt
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp // Obtiene el tamaño de la informacion de version de
& nbsp & nbsp Len := GetFileVersionInfoSize (PChar (ThisSourceFile), Mango)
& nbsp & nbsp // Asignar VersionInfo tamaño de bufer
& nbsp & nbsp SetLength (VersionInfo, Len 1)
& nbsp & nbsp // Obtener informacion de la version
& nbsp & nbsp si GetFileVersionInfo (PChar(ThisSourceFile), Mango, Len,
& nbsp & nbsp & nbsp & nbsp Puntero(VersionInfo)) entonces
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp // Obtener la traduccion info para los Idiomas / CharSet Id
& nbsp & nbsp & nbsp & nbsp si VerQueryValue(PointerVersionInfo), '/VarFileInfo/Traduccion',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Puntero(PCharset), InfoLength), a continuacion,
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp LangCharset := Format ('%.4x%.4x',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp [LoWord (PCharset^), HiWord (PCharset^)])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp InfoAvailable := True
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Obtener la version estandar de la informacion
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp para ThisInfo := 0 a MaxVersionKeys hacer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp StandardKeys[ThisInfo] :=
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetKey(VersionKeyNames[ThisInfo])
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
fin
funcion TVersionInfo.GetKey (ThisKeyName: string): string
var
& nbsp & nbsp InfoLength: UINT
begin
& nbsp & nbsp si InfoAvailable, a continuacion,
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp SetLength (Resultado, 255)
& nbsp & nbsp & nbsp & nbsp si VerQueryValue (Puntero(VersionInfo),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar(Format('/StringFileInfo/%s/%s',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp [LangCharset, ThisKeyName])), Indicador(Resultado),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp InfoLength) a continuacion,
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SetString(Resultado, PChar(Resultado), InfoLength - 1)
& nbsp & nbsp & nbsp & nbsp end else
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := '
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp end else
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := 'N/A'
& nbsp & nbsp final
fin
funcion TVersionInfo.GetVersionInfo(Index: Integer): string
begin
& nbsp & nbsp Resultado := StandardKeys[Indice]
fin
procedimiento TVersionInfo.SetVersionInfo(Index: Integer
& nbsp & nbsp Valor: string)
begin
& nbsp & nbsp StandardKeys[Indice] := Valor
fin
funcion TVersionInfo.GetBuildNumber: string
begin
& nbsp & nbsp // Tira el ultimo elemento de la version del archivo
& nbsp & nbsp Resultado := FileVersion
& nbsp & nbsp mientras Pos ('.', Resultado) > 0 hacer
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := Copy (Resultado, Pos ('.', Resultado) 1, Length(Resultado))
& nbsp & nbsp final
fin
Uno de los matices de la forma en que la informacion de la version almacenada en la aplicacion de recursos de la seccion es que es posible definir que conjunto de caracteres del lenguaje ha sido utilizado para crear la informacion de version (y la aplicacion o DLL). Este se define dentro de la informacion de version como una palabra doble, o de 32 bits entero sin signo, y debe estar presente como parte de la informacion de la version de la cadena (en formato hexadecimal) para cada una de las claves que se extraen. Uno de los trabajos de la constructora, asi como la extraccion de la informacion de version en un bufer de cadena (una forma conveniente de almacenar estatica datos devueltos por las llamadas a la API) es extraer el idioma y el juego de caracteres de la informacion y construir una correcta cadena hexadecimal que se utilizara en el futuro llama a VerQueryValue. Una vez hecho esto el constructor, a continuacion, hace una llamada a la rutina que devuelve realmente una version de el valor de la informacion para una llave de serie. Esta rutina vive una doble vida, ademas que disfraza la funcion de descriptor de acceso de la Llave de la propiedad. De nuevo, un aspecto interesante de este proceso es que el constructor obtiene una lista de los estandar de los nombres clave de un privado constante de cadena fija de la matriz que se declara y define en una sola instruccion. Esto tambien es un poco usada, pero muy util, tecnica que tambien es permitido para las variables globales, asi como constantes.
Si usted se refiere de nuevo a la Figura 1 se puede ver algo mas de informacion de control de versiones en el grupo llamado 'Modulo de atributos', principalmente un conjunto de indicadores que describen el estado de la aplicacion, si se trata de una depuracion o privado a construir y asi sucesivamente. Esta informacion tambien esta disponible en el archivo de recursos, y se puede acceder utilizando la API VerQueryValue comando, pero con un segundo parametro de solo '/', en lugar de '/VarFileInfo/Traduccion'. En esta instancia, lo que se devuelve es un puntero a una estructura que contiene detalles acerca del tipo de archivo y el contenido, haga doble pares de palabras que pueden ser combinados para representar una estricta version de 64 bits de numero que se utiliza para la estricta comparaciones numericas (por los programas de instalacion), asi como el Modulo de atributos definibles dentro de Delphi. Seria una tarea sencilla para extender la TVersionInfo constructor para extraer esta informacion y exponerlo a traves de simples propiedades Booleanas y, en Delphi 5, Int64 tipos de propiedad para la version estricta de los numeros.
Esta capacidad para encapsular el acceso a estructuras de datos complejas a traves de una comoda interfaz es una de las bellezas de la Orientacion a Objetos, y a la que vamos a estar volviendo continuamente. La clase definida aqui ya ha expuesto el numero de compilacion como propiedad separada, que a su vez deriva del ultimo elemento de FileVersion para proporcionar a los usuarios de la clase con los datos de la manera mas conveniente. Por ejemplo, un uso apropiado de esto seria en el cuadro Acerca de una aplicacion, mostrando no solo el nombre de la aplicacion y los detalles de copyright, sino tambien la version del programa y el numero de compilacion para una facil referencia.
Para completar nuestro examen de un proceso de construccion seria muy bonito si, despues de haber completado con exito, se podria incrementar el numero de compilacion (y posiblemente el numero de version) dentro de la informacion de version de todos los entregables. Delphi aparece para almacenar esta informacion de la version dentro de la .DOF archivo que acompaña al proyecto, este es en formato de archivo INI y contiene la mayoria de los detalles expuestos por el Proyecto | Opciones de dialogo. Sin embargo, mediante programacion de hacer cambios a este archivo (no hay entradas en la [Informacion de Version] de la seccion para cosas como MajorVer, Liberacion y asi sucesivamente) no es realmente el resultado de los cambios a la aplicacion compilada. Esto es debido a que Delphi genera el archivo de recursos compilado (Proyecto.RES) a partir de esta informacion unicamente cuando se cambia de forma interactiva desde dentro mismo Delphi. El .RES compilado archivo de recursos es simplemente vinculado a la aplicacion en tiempo de compilacion, por lo que la realizacion de cambios a la .DOF archivo y, a continuacion, volver a compilar la aplicacion no causa el archivo de recursos para ser regenerado y la fecha de salida de uno es usado. Es una buena practica, por tanto, la actualizacion de la acumulacion y la liberacion de los numeros de Delphi de cada proyecto con la mano al final de cada generacion correcta.
En el siguiente articulo vamos a empezar a diseñar las clases que vamos a necesitar para producir un verdaderamente orientado a objetos de la aplicacion, la encapsulacion de los objetos de negocio y acceso a bases de datos en un altamente productiva. Este sera un gran odisea que cubren casi todos los aspectos del desarrollo de aplicaciones Windows.
el Siguiente en la serie


La adición de la información de la versión de las aplicaciones

La adición de la información de la versión de las aplicaciones : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación