En ajoutant les informations de version pour les applications


Cet article, je vais étudier les moyens par lesquels des informations de version peuvent être mis à disposition au sein d'une application, l'écriture d'une classe qui peut être intégré dans tout nouveau développement.
en Ajoutant des Informations De Version des Applications
Dernier article, j'ai abordé le concept de construire, et pourquoi un processus standard pour produire un ensemble cohérent de produits livrables était une bonne chose.
Depuis les premiers programmes informatiques ont été déployés, les développeurs voulaient avoir un moyen d'identifier la version d'un client a été en cours d'exécution après tout, il est évidemment intéressant de savoir si un bug ils sont des rapports a déjà été fixé. Assez rapidement (et évidemment) d'un système numérique a évolué, tout simplement incrémenter le numéro de version à chaque fois qu'un communiqué a été fait. Comme la fréquence des rejets ont augmenté, les développeurs voulaient avoir un moyen de distinguer une nouvelle version majeure par rapport à un intermédiaire: le concept de versions majeures et mineures de un a lancé le programme de cours à partir de V1.12 à V2.0 transmis beaucoup plus (même de simples utilisateurs) que de passer de V12 de V13. Pendant de nombreuses années, la majeure et la mineure de la version adéquate et banal, mais que les programmes sont devenus plus importants et complexes, de plus en plus fréquentes corrections de bogues tertiaire nombre a été cloué sur la fin de la version d'indiquer une 'libération'. Toutes les versions avec le même mineures et majeures et les numéros de version doit avoir un identique liste de fonctionnalités, mais devrait inclure cumulatif de correctifs de bugs et autres améliorations sans l'ajout de nouvelles fonctionnalités en tant que tel. Dernièrement, il est devenu de bonne pratique pour ajouter le numéro de build de la version résultant dans un numéro de version complète avec quatre composants, X. Y. Z. B, où X représente le numéro de version principale, Y la de version mineure, Z le numéro de version et B le numéro de build. Notez que bien que les petites et les versions peuvent être remis à zéro (avec majeure et mineure versions), le numéro de build est jamais remis à zéro et, par conséquent, augmente toujours avec chaque nouvelle version (bien que pas nécessairement strictement incrémentielles il est très possible d'avoir de développement interne au sein d'une entreprise qui ne sont pas diffusées à des clients). Listing 1 résume lors de chaque numéro de version du composant doit être incrémenté.





ComposantDécritQuand Incrément
XMajeurAprès d'importantes modifications ont été apportées à l'application
YMineurAprès de nouvelles fonctionnalités ont été ajoutées à l'application
ZVersionChaque fois qu'une mise à jour mineure est mis à disposition avec des corrections de bugs
BConstructionChaque fois que le processus de génération terminée


Liste 1 - les Composants de numéro de version X. Y. Z. B
Bien que les services marketing détourné le concept de numéros de version pour leurs propres fins une fois qu'il a été rendu compte qu'un grand nombre de gens seraient prêts à investir dans des mises à niveau lorsque le numéro de version majeur changé ou sautée à la concurrence, il est toujours très utile d'avoir une sorte de un officiel numéro de version dans vos applications, il est beaucoup plus facile de confirmer que votre client est en cours d'exécution Construire 134 ou plus tard, plutôt que de 'SuperApp 97 SR-2a Patch 13 (Y2K)'. Cela est devenu particulièrement important avec l'avènement de la DLL partagée bibliothèques au sein de Windows, qui pourrait être remplacé par un fraîchement installé l'application. Bien que pas très bon à l'aide de la numérotation cohérente, pratiquement toutes les applications de Microsoft, les fichiers (EXE et DLL) contiennent maintenant une sorte de 4 chiffres du numéro de version incorporés. En effet, Windows 2000 permet une vaste utilisation de cette information dans une tentative pour empêcher les fichiers système importants étant remplacé par une version antérieure, ou parfois plus tard, des versions. Les procédures d'Installation également faire usage de cette information par d'avertissement lorsqu'un fichier serait de remplacer un nom similaire, mais plus tard, une version de lui-même.
la Version Embarquée de l'Information
Si vous faites un clic droit sur un fichier EXE ou DLL fichier dans l'Explorateur le menu pop-up qui s'affiche a une entrée à bas appelé 'Propriétés'. La sélection de cette montre quelques détails sur le fichier. Si disponible, le deuxième onglet (appelé Version) affiche les informations incorporées dans le fichier sur le numéro de version, nom du produit, les droits d'auteur et ainsi de suite. Tout fichier peut avoir une ressource segment peut avoir cette information intégré, et cela inclut les applications compilées avec Delphi. Microsoft a publié l'information et le format qui doit être fourni dans la section ressources pour obtenir cette information à afficher. Dans Delphi 2, le seul moyen par lequel cela pourrait être par la création d'un fichier de ressources avec exactement les bonnes cordes en son sein, de compiler séparément avec le compilateur de ressources et de liant dans l'application (cela faisant partie des principaux processus de construction). Bien que n'étant pas difficile, ces étapes nécessaires à un niveau de connaissances techniques et de compétences telles que peu de développeurs d'application de la peine de le faire. À l'intérieur de son ethos de Windows le développement plus productif, Delphi 3 a présenté une boîte de dialogue par lequel cette information pourrait facilement être joints à la demande. La Figure 1 montre cette boîte de dialogue, disponible à partir du Delphi Projet de menu, les Options de l'élément.
En cochant la case en haut de l'onglet pour afficher que les informations de numéro de version doit être inclus, il est possible d'ajouter des détails au sujet non seulement le numéro de version, mais aussi les drapeaux de savoir si la construction est prévu pour une sortie publique, et au fond, il est possible d'ajouter des informations à un ensemble de la liste des catégories prédéfinies, telles que la description du fichier et le droit d'auteur. Delphi change automatiquement le FileVersion catégorie que le module numéro de version de détails ci-dessus sont mis à jour. Lorsque cette boîte de dialogue est confirmé, Delphi constructions de la ressource nécessaire de fichier (qui contient également des détails tels que l'icône de l'application) la transparence de l'étape, qui sera automatiquement lié à l'exécutable final. Si vous le faites de même le projet le plus simple, vous verrez que vous pouvez maintenant faire un clic droit sur l'exécutable et obtenir les informations de version, comme tous bien comportés les applications Windows.
Quelle Version Suis-je?
Maintenant que nous savons comment placer les informations de version dans l'application, il serait utile d'accéder à l'information. Après tout, si vous essayez d'établir au téléphone que la version d'un utilisateur est en cours d'exécution, il serait beaucoup plus facile de décrire comment afficher la boîte de dialogue about plutôt que de trouver l'exécutable de l'application dans l'Explorateur, puis clic droit, sélectionnez Propriétés et en sélectionnant l'onglet Version.
Comme les informations de version sont simplement stockés comme des chaînes de caractères dans un format spécifique dans la section des ressources de l'application, il serait possible d'utiliser Win32 standard de ressources fichier de commandes pour extraire les informations pertinentes, le décodage de la structure. Il ya, cependant, certaines commandes de l'API Win32 qui font juste ce beaucoup plus pratique. Ce sont GetFileVersionInfoSize (qui renvoie des informations sur l'espace requis pour stocker les informations de version), GetFileVersionInfo (qui extrait les détails dans un pré-tampon de la bonne taille), et VerQueryValue (extraits d'un nom de morceau de informations de version à partir de la mémoire tampon, tels que 'LegalCopyright'). Comme d'habitude lors de l'interaction avec l'API Win32, ces commandes doivent être appelés dans le bon ordre, la préservation de certaines valeurs internes retourné à partir de précédentes commandes par l'intermédiaire de var paramètres.
C'est une très bonne idée d'encapsuler tout type d'interaction avec l'API Windows avec une interface utilisateur plus et Delphi-interface conviviale. Typique Delphi programmeurs ne voulez pas avoir affaire avec l'allocation de blocs de mémoire et Win32 types spécifiques comme DWORD et UINT, et ils ne devaient. De loin préférable de concevoir une classe de nice, dans les meilleures traditions de l'OO, les peaux brutes d'accès à des informations de version et présente une beaucoup plus utilisable interface. Ceci a l'avantage que si le stockage de ces informations sur la version de changer, dans la même classe peuvent encapsuler les dépendances du système tout en conservant la même interface publique.
Il ya quelques choses à considérer lors de la conception de cette classe. Tout d'abord, il devrait pouvoir être utilisé avec n'importe quel fichier de l'application, y compris celle à partir de laquelle il est en cours d'exécution. Deuxièmement, il doit fournir un accès pratique à la norme et le plus couramment utilisé des informations de version de touches (FileVersion, ProductName etc.). Enfin, comme il est possible pour l'utilisateur de fournir d'autres version personnalisée de clés et de valeurs au sein de leur structure, la classe devrait exposer ces d'une manière naturelle. Le Listing 2 présente l'interface publique de cette classe.
TVersionInfo = classe
private
& nbsp & nbsp fonction GetVersionInfo (Index: Integer): String
public
& nbsp & nbsp constructeur Créer (ThisSourceFile: String)
& nbsp & nbsp destructeur de Détruire remplacer
& nbsp & nbsp // Arbitraire des informations clés
& nbsp & nbsp Clé de propriété[KeyName: String]: Chaîne de lire GetKey
& nbsp & nbsp // clé Standard de l'information
& nbsp & nbsp propriété de la Société: String index 0 lire GetVersionInfo
& ! & ! & ! & nbsp écrire SetVersionInfo
& nbsp & nbsp propriété FileDescription: String index 1 lire GetVersionInfo
& nbsp & nbsp propriété FileVersion: String index 2 lire GetVersionInfo
& nbsp & nbsp propriété InternalName: Index de chaîne 3 lire GetVersionInfo
& nbsp & nbsp propriété du droit d'Auteur: String index 4 lire GetVersionInfo
& nbsp & nbsp propriété des Marques de commerce: String index 5 lire GetVersionInfo
& nbsp & nbsp propriété OriginalFileName: String index 6 lire GetVersionInfo
& nbsp & nbsp propriété ProductName: String index 7 lire GetVersionInfo
& ! & ! & ! & nbsp écrire SetVersionInfo
& nbsp & nbsp propriété ProductVersion: Index de chaîne 8 lire GetVersionInfo
& ! & ! & ! & nbsp écrire SetVersionInfo
& nbsp & nbsp propriété Commentaires: String index 9 lire GetVersionInfo
& nbsp & nbsp propriété BuildNumber: Chaîne de lecture GetBuildNumber
fin
Listing 2 - interface Publique de TVersionInfo

Comme on peut le voir à partir de la classe, de la clé standard noms sont exposées comme des propriétés nommées, alors que la propriété de la Clé permet d'accéder à la coutume de l'information additionnelle par le nom. La classe est construit par passage dans un chemin d'accès complet et le nom de fichier de la version à laquelle les informations doivent être extraites. Il y a un aspect très intéressant à propos de cette classe, qui témoigne d'une sous-utilisé aspect de Delphi conception de classe: à l'aide de l'index de l'identificateur de la carte un certain nombre de propriétés différentes sur la même fonction d'accès. Comme peut être vu à partir de la mise en œuvre privée de GetVersionInfo utilisé pour lire les propriétés de cette valeur de l'indice est passée dans selon la propriété accessible, permettant à la fonction pour déterminer la valeur à retourner. Comme nous le verrons dans la mise en œuvre, cela permet souvent de très concis de codage.
Comme mentionné précédemment, le GetFileVersionInfo commande extrait les détails de la section des ressources et les stocke dans la mémoire tampon passée en paramètre à l'appel de l'API. Il est donc logique d'effectuer une opération ponctuelle dans le constructeur. Une fois que cette information a été extraite, nous pouvons interroger les clés connus les noms. Pour la pratique de codage et d'augmenter la performance, nous allons extraire les valeurs de clé pour l'ensemble de la clé standard noms et de stocker ces valeurs dans un tableau avec la même valeur ordinale comme chaque index de la propriété. Cela signifie que la mise en œuvre de la GetVersionInfo propriété accesseur de la fonction peut être de façon transparente, simple et retourne un tableau de la valeur à l'indice fourni. La coutume clés qui pourraient en outre être fourni, nous allons simplement appeler l'API de commande pour extraire les détails de la version de l'information de la mémoire tampon. Bien que ce sera un peu plus lent que l'accès à l'détails directement à partir d'une pré-calculées de tableau, il n'est pas prévu que ces propriétés seront fréquemment consultées et c'est donc une conception acceptable de décision. Le Listing 3 montre l'implémentation de la classe.
constructeur TVersionInfo.Créer (ThisSourceFile: String)
const
& nbsp & nbsp VersionKeyNames: array [0..MaxVersionKeys] of String =
& nbsp & nbsp & nbsp ('Société', 'FileDescription', 'FileVersion', 'InternalName',
& ! & ! & ! & ! 'LegalCopyright', 'LegalTrademarks', 'OriginalFilename',
& ! & ! & ! & nbsp 'ProductName', 'ProductVersion', 'Commentaires')
var
& nbsp & nbsp ThisInfo: Integer
& nbsp & nbsp InfoLength: UINT
& nbsp & nbsp Len: DWORD
& nbsp & nbsp Poignée: DWORD
& nbsp & nbsp PCharset: PLongInt
begin
& nbsp & nbsp hérité de Créer
& nbsp & nbsp // récupération de la taille de la version info
& nbsp & nbsp Len := GetFileVersionInfoSize (PChar (ThisSourceFile), la Poignée)
& nbsp & nbsp // allocation de la VersionInfo taille de la mémoire tampon
& nbsp & nbsp SetLength (VersionInfo, Len 1)
& nbsp & nbsp // Obtenir les informations de version
& nbsp & nbsp si GetFileVersionInfo (PChar(ThisSourceFile), Poignée, Len,
& ! & ! & ! & nbsp Pointeur(VersionInfo))
& nbsp & nbsp commencer
& ! & ! & ! & nbsp // Obtenir la traduction d'informations pour la Langue / CharSet Id
& ! & ! & ! & nbsp si VerQueryValue(PointerVersionInfo), '\VarFileInfo\Translation',
& ! & ! & ! & ! & ! & nbsp Pointeur(PCharset), InfoLength)
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp LangCharset := Format ('%.4x%.4x',
& ! & ! & ! & ! & ! & ! & ! & nbsp [LoWord (PCharset^), HiWord (PCharset^)])
& ! & ! & ! & ! & ! & nbsp InfoAvailable := True
& ! & ! & ! & ! & ! & nbsp // Obtenez la version standard de l'information
& ! & ! & ! & ! & ! & nbsp pour ThisInfo := De 0 à MaxVersionKeys ne
& ! & ! & ! & ! & ! & ! & ! & nbsp StandardKeys[ThisInfo] :=
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp GetKey(VersionKeyNames[ThisInfo])
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin
fin
fonction de TVersionInfo.GetKey (ThisKeyName: string): string
var
& nbsp & nbsp InfoLength: UINT
begin
& nbsp & nbsp si InfoAvailable puis
& nbsp & nbsp commencer
& ! & ! & ! & nbsp SetLength (Résultat, 255)
& ! & ! & ! & nbsp si VerQueryValue (Pointeur(VersionInfo),
& ! & ! & ! & ! & ! & nbsp PChar(Format('\StringFileInfo\%s\%s',
& ! & ! & ! & ! & ! & nbsp [LangCharset, ThisKeyName])), (Pointeur)
& ! & ! & ! & ! & ! & nbsp InfoLength) puis
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp SetString(Résultat, PChar(Suite), InfoLength - 1)
& ! & ! & ! & nbsp fin else
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp Résultat := '
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin else
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Result := 'N/A'
& nbsp & nbsp fin
fin
fonction de TVersionInfo.GetVersionInfo(Index: Integer): string
begin
& nbsp & nbsp Résultat := StandardKeys[Index]
fin
procédure TVersionInfo.SetVersionInfo(Index: Integer
& nbsp & nbsp Value: string)
begin
& nbsp & nbsp StandardKeys[Index] := Valeur
fin
fonction de TVersionInfo.GetBuildNumber: string
begin
& nbsp & nbsp // Bande le dernier élément à partir de la version du fichier
& nbsp & nbsp Résultat := FileVersion
& nbsp & nbsp tandis que Pos ('.', Le résultat) > 0 do
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Résultat := Copy (Résultat, Pos ('.', Le résultat) 1, Longueur(Result))
& nbsp & nbsp fin
fin
l'Une des nuances de la façon dont les informations de version sont stockées dans des ressources de l'application de la section, c'est qu'il est possible de définir la langue de jeu de caractères a été utilisé pour créer les informations de version (et l'application ou la DLL elle-même). Cela est défini dans les informations de version comme un double mot, ou 32 bits entier non signé, et doivent être présents dans le cadre de l'information sur la version de la chaîne (au format hexadécimal) pour chaque clé qui est extrait. L'un des emplois du constructeur, ainsi que l'extraction de l'information de version dans un tampon de chaîne (un moyen pratique de stocker statique des données renvoyées par les appels de l'API) est d'extraire la langue et le jeu de caractères de l'information et de construire une bonne chaîne hexadécimale qui seront utilisées dans les futurs appels à VerQueryValue. Une fois que cela a été fait, le constructeur fait alors un appel à la routine qui renvoie une information de version de la valeur pour une clé fournie. Cette routine une double vie, en outre, se faisant passer pour la fonction d'accesseur pour la propriété de la Clé. Encore une fois, un aspect intéressant de ce processus est que le constructeur obtient une liste de la clé standard noms auprès d'une constante chaîne de caractères fixe tableau qui est déclarée et définie dans un seul énoncé. C'est aussi un peu utilisé, mais très pratique, technique qui est également autorisée pour les variables globales, ainsi que des constantes.
Si vous référer à la Figure 1, vous pouvez voir certains d'appoint informations de contrôle de version dans le groupe appelé 'les attributs de Module', un ensemble d'indicateurs décrivant l'état de la demande, si c'est un debug ou privés construire et ainsi de suite. Cette information est également disponible dans le fichier de ressources, et peut être consulté à l'aide de l'API de VerQueryValue de commande, mais avec un deuxième paramètre de '\', plutôt que '\VarFileInfo\' Traduction'. Dans ce cas, ce qui est retourné est un pointeur vers une structure qui contient des détails sur le type de fichier et le contenu, double paires de mots qui peuvent être combinés pour représenter une stricte 64 bits numéro de version utilisé pour le strict comparaisons numériques (par des programmes d'installation) ainsi que les attributs de Module définissable dans Delphi. Ce serait une tâche simple pour étendre la TVersionInfo constructeur pour extraire cette information et de l'exposer à l'aide de simples propriétés Booléennes et, dans Delphi 5, Int64 types de propriété pour la stricte numéros de version.
Cette capacité à encapsuler l'accès à des structures de données complexes via une interface pratique est l'une des beautés de l'Orientation de l'Objet, et que l'on sera continuellement de retour. La classe définie ici a déjà exposé le numéro de build comme une séparation de biens, lui-même dérivé à partir du dernier élément de FileVersion de fournir aux utilisateurs de la classe avec les données d'une manière commode. Par exemple, une utilisation appropriée de ce serait sur la zone à Propos d'une application, montrant non seulement le nom de l'application et les droits d'auteur, mais aussi la version du programme et le numéro de build pour référence facile.
Pour terminer notre examen d'un processus de construction, il serait très bien si, après avoir effectué avec succès, il pourrait incrémenter le numéro de version (et éventuellement numéro de version) dans les informations de version de tous les livrables. Delphi apparaît pour stocker ces informations de version dans le .DOF fichier qui accompagne le projet, c'est dans le fichier INI de format et contient la plupart des détails exposés par le Projet | boîte de dialogue Options. Cependant, par programme à apporter des modifications à ce fichier (il y a des entrées dans la [Version Info] la section pour des choses comme MajorVer, la Libération et ainsi de suite) ne le fait pas suite à des modifications à l'application compilée. C'est parce que Delphi génère le fichier de ressources compilés (du Projet.RES) à partir de cette information que lorsqu'elle est modifiée de manière interactive à partir de l'intérieur de Delphes lui-même. L' .RES compilé fichier de ressources est simplement liée à l'application au moment de la compilation, afin d'apporter des changements à la .DOF fichier, puis recompiler l'application ne cause pas le fichier de ressources à régénérer et à la sortir de la date qui est utilisée. Il est de bonne pratique donc pour mettre à jour l'accumulation et la libération des nombres de chaque projet Delphi par part à la fin de chaque génération réussie.
Dans l'article suivant, nous allons commencer à concevoir les classes que nous aurons besoin de produire un véritable orientée objet application, l'encapsulation des objets métiers et de base de données access dans un très productif. Ce sera l'un des principaux odyssée couvrant presque tous les aspects du développement d'applications Windows.
Suivant dans la série









En ajoutant les informations de version pour les applications


En ajoutant les informations de version pour les applications : Plusieurs milliers de conseils pour vous faciliter la vie.


Cet article, je vais etudier les moyens par lesquels des informations de version peuvent etre mis a disposition au sein d'une application, l'ecriture d'une classe qui peut etre integre dans tout nouveau developpement.
en Ajoutant des Informations De Version des Applications
Dernier article, j'ai aborde le concept de construire, et pourquoi un processus standard pour produire un ensemble coherent de produits livrables etait une bonne chose.
Depuis les premiers programmes informatiques ont ete deployes, les developpeurs voulaient avoir un moyen d'identifier la version d'un client a ete en cours d'execution apres tout, il est evidemment interessant de savoir si un bug ils sont des rapports a deja ete fixe. Assez rapidement (et evidemment) d'un systeme numerique a evolue, tout simplement incrementer le numero de version a chaque fois qu'un communique a ete fait. Comme la frequence des rejets ont augmente, les developpeurs voulaient avoir un moyen de distinguer une nouvelle version majeure par rapport a un intermediaire: le concept de versions majeures et mineures de un a lance le programme de cours a partir de V1.12 a V2.0 transmis beaucoup plus (meme de simples utilisateurs) que de passer de V12 de V13. Pendant de nombreuses annees, la majeure et la mineure de la version adequate et banal, mais que les programmes sont devenus plus importants et complexes, de plus en plus frequentes corrections de bogues tertiaire nombre a ete cloue sur la fin de la version d'indiquer une 'liberation'. Toutes les versions avec le meme mineures et majeures et les numeros de version doit avoir un identique liste de fonctionnalites, mais devrait inclure cumulatif de correctifs de bugs et autres ameliorations sans l'ajout de nouvelles fonctionnalites en tant que tel. Dernierement, il est devenu de bonne pratique pour ajouter le numero de build de la version resultant dans un numero de version complete avec quatre composants, X. Y. Z. B, ou X represente le numero de version principale, Y la de version mineure, Z le numero de version et B le numero de build. Notez que bien que les petites et les versions peuvent etre remis a zero (avec majeure et mineure versions), le numero de build est jamais remis a zero et, par consequent, augmente toujours avec chaque nouvelle version (bien que pas necessairement strictement incrementielles il est tres possible d'avoir de developpement interne au sein d'une entreprise qui ne sont pas diffusees a des clients). Listing 1 resume lors de chaque numero de version du composant doit etre incremente.





ComposantDecritQuand Increment
XMajeurApres d'importantes modifications ont ete apportees a l'application
YMineurApres de nouvelles fonctionnalites ont ete ajoutees a l'application
ZVersionChaque fois qu'une mise a jour mineure est mis a disposition avec des corrections de bugs
BConstructionChaque fois que le processus de generation terminee


Liste 1 - les Composants de numero de version X. Y. Z. B
Bien que les services marketing detourne le concept de numeros de version pour leurs propres fins une fois qu'il a ete rendu compte qu'un grand nombre de gens seraient prets a investir dans des mises a niveau lorsque le numero de version majeur change ou sautee a la concurrence, il est toujours tres utile d'avoir une sorte de un officiel numero de version dans vos applications, il est beaucoup plus facile de confirmer que votre client est en cours d'execution Construire 134 ou plus tard, plutot que de 'SuperApp 97 SR-2a Patch 13 (Y2K)'. Cela est devenu particulierement important avec l'avenement de la DLL partagee bibliotheques au sein de Windows, qui pourrait etre remplace par un fraîchement installe l'application. Bien que pas tres bon a l'aide de la numerotation coherente, pratiquement toutes les applications de Microsoft, les fichiers (EXE et DLL) contiennent maintenant une sorte de 4 chiffres du numero de version incorpores. En effet, Windows 2000 permet une vaste utilisation de cette information dans une tentative pour empecher les fichiers systeme importants etant remplace par une version anterieure, ou parfois plus tard, des versions. Les procedures d'Installation egalement faire usage de cette information par d'avertissement lorsqu'un fichier serait de remplacer un nom similaire, mais plus tard, une version de lui-meme.
la Version Embarquee de l'Information
Si vous faites un clic droit sur un fichier EXE ou DLL fichier dans l'Explorateur le menu pop-up qui s'affiche a une entree a bas appele 'Proprietes'. La selection de cette montre quelques details sur le fichier. Si disponible, le deuxieme onglet (appele Version) affiche les informations incorporees dans le fichier sur le numero de version, nom du produit, les droits d'auteur et ainsi de suite. Tout fichier peut avoir une ressource segment peut avoir cette information integre, et cela inclut les applications compilees avec Delphi. Microsoft a publie l'information et le format qui doit etre fourni dans la section ressources pour obtenir cette information a afficher. Dans Delphi 2, le seul moyen par lequel cela pourrait etre par la creation d'un fichier de ressources avec exactement les bonnes cordes en son sein, de compiler separement avec le compilateur de ressources et de liant dans l'application (cela faisant partie des principaux processus de construction). Bien que n'etant pas difficile, ces etapes necessaires a un niveau de connaissances techniques et de competences telles que peu de developpeurs d'application de la peine de le faire. A l'interieur de son ethos de Windows le developpement plus productif, Delphi 3 a presente une boîte de dialogue par lequel cette information pourrait facilement etre joints a la demande. La Figure 1 montre cette boîte de dialogue, disponible a partir du Delphi Projet de menu, les Options de l'element.
En cochant la case en haut de l'onglet pour afficher que les informations de numero de version doit etre inclus, il est possible d'ajouter des details au sujet non seulement le numero de version, mais aussi les drapeaux de savoir si la construction est prevu pour une sortie publique, et au fond, il est possible d'ajouter des informations a un ensemble de la liste des categories predefinies, telles que la description du fichier et le droit d'auteur. Delphi change automatiquement le FileVersion categorie que le module numero de version de details ci-dessus sont mis a jour. Lorsque cette boîte de dialogue est confirme, Delphi constructions de la ressource necessaire de fichier (qui contient egalement des details tels que l'icone de l'application) la transparence de l'etape, qui sera automatiquement lie a l'executable final. Si vous le faites de meme le projet le plus simple, vous verrez que vous pouvez maintenant faire un clic droit sur l'executable et obtenir les informations de version, comme tous bien comportes les applications Windows.
Quelle Version Suis-je?
Maintenant que nous savons comment placer les informations de version dans l'application, il serait utile d'acceder a l'information. Apres tout, si vous essayez d'etablir au telephone que la version d'un utilisateur est en cours d'execution, il serait beaucoup plus facile de decrire comment afficher la boîte de dialogue about plutot que de trouver l'executable de l'application dans l'Explorateur, puis clic droit, selectionnez Proprietes et en selectionnant l'onglet Version.
Comme les informations de version sont simplement stockes comme des chaînes de caracteres dans un format specifique dans la section des ressources de l'application, il serait possible d'utiliser Win32 standard de ressources fichier de commandes pour extraire les informations pertinentes, le decodage de la structure. Il ya, cependant, certaines commandes de l'API Win32 qui font juste ce beaucoup plus pratique. Ce sont GetFileVersionInfoSize (qui renvoie des informations sur l'espace requis pour stocker les informations de version), GetFileVersionInfo (qui extrait les details dans un pre-tampon de la bonne taille), et VerQueryValue (extraits d'un nom de morceau de informations de version a partir de la memoire tampon, tels que 'LegalCopyright'). Comme d'habitude lors de l'interaction avec l'API Win32, ces commandes doivent etre appeles dans le bon ordre, la preservation de certaines valeurs internes retourne a partir de precedentes commandes par l'intermediaire de var parametres.
C'est une tres bonne idee d'encapsuler tout type d'interaction avec l'API Windows avec une interface utilisateur plus et Delphi-interface conviviale. Typique Delphi programmeurs ne voulez pas avoir affaire avec l'allocation de blocs de memoire et Win32 types specifiques comme DWORD et UINT, et ils ne devaient. De loin preferable de concevoir une classe de nice, dans les meilleures traditions de l'OO, les peaux brutes d'acces a des informations de version et presente une beaucoup plus utilisable interface. Ceci a l'avantage que si le stockage de ces informations sur la version de changer, dans la meme classe peuvent encapsuler les dependances du systeme tout en conservant la meme interface publique.
Il ya quelques choses a considerer lors de la conception de cette classe. Tout d'abord, il devrait pouvoir etre utilise avec n'importe quel fichier de l'application, y compris celle a partir de laquelle il est en cours d'execution. Deuxiemement, il doit fournir un acces pratique a la norme et le plus couramment utilise des informations de version de touches (FileVersion, ProductName etc.). Enfin, comme il est possible pour l'utilisateur de fournir d'autres version personnalisee de cles et de valeurs au sein de leur structure, la classe devrait exposer ces d'une maniere naturelle. Le Listing 2 presente l'interface publique de cette classe.
TVersionInfo = classe
private
& nbsp & nbsp fonction GetVersionInfo (Index: Integer): String
public
& nbsp & nbsp constructeur Creer (ThisSourceFile: String)
& nbsp & nbsp destructeur de Detruire remplacer
& nbsp & nbsp // Arbitraire des informations cles
& nbsp & nbsp Cle de propriete[KeyName: String]: Chaîne de lire GetKey
& nbsp & nbsp // cle Standard de l'information
& nbsp & nbsp propriete de la Societe: String index 0 lire GetVersionInfo
& ! & ! & ! & nbsp ecrire SetVersionInfo
& nbsp & nbsp propriete FileDescription: String index 1 lire GetVersionInfo
& nbsp & nbsp propriete FileVersion: String index 2 lire GetVersionInfo
& nbsp & nbsp propriete InternalName: Index de chaîne 3 lire GetVersionInfo
& nbsp & nbsp propriete du droit d'Auteur: String index 4 lire GetVersionInfo
& nbsp & nbsp propriete des Marques de commerce: String index 5 lire GetVersionInfo
& nbsp & nbsp propriete OriginalFileName: String index 6 lire GetVersionInfo
& nbsp & nbsp propriete ProductName: String index 7 lire GetVersionInfo
& ! & ! & ! & nbsp ecrire SetVersionInfo
& nbsp & nbsp propriete ProductVersion: Index de chaîne 8 lire GetVersionInfo
& ! & ! & ! & nbsp ecrire SetVersionInfo
& nbsp & nbsp propriete Commentaires: String index 9 lire GetVersionInfo
& nbsp & nbsp propriete BuildNumber: Chaîne de lecture GetBuildNumber
fin
Listing 2 - interface Publique de TVersionInfo

Comme on peut le voir a partir de la classe, de la cle standard noms sont exposees comme des proprietes nommees, alors que la propriete de la Cle permet d'acceder a la coutume de l'information additionnelle par le nom. La classe est construit par passage dans un chemin d'acces complet et le nom de fichier de la version a laquelle les informations doivent etre extraites. Il y a un aspect tres interessant a propos de cette classe, qui temoigne d'une sous-utilise aspect de Delphi conception de classe: a l'aide de l'index de l'identificateur de la carte un certain nombre de proprietes differentes sur la meme fonction d'acces. Comme peut etre vu a partir de la mise en œuvre privee de GetVersionInfo utilise pour lire les proprietes de cette valeur de l'indice est passee dans selon la propriete accessible, permettant a la fonction pour determiner la valeur a retourner. Comme nous le verrons dans la mise en œuvre, cela permet souvent de tres concis de codage.
Comme mentionne precedemment, le GetFileVersionInfo commande extrait les details de la section des ressources et les stocke dans la memoire tampon passee en parametre a l'appel de l'API. Il est donc logique d'effectuer une operation ponctuelle dans le constructeur. Une fois que cette information a ete extraite, nous pouvons interroger les cles connus les noms. Pour la pratique de codage et d'augmenter la performance, nous allons extraire les valeurs de cle pour l'ensemble de la cle standard noms et de stocker ces valeurs dans un tableau avec la meme valeur ordinale comme chaque index de la propriete. Cela signifie que la mise en œuvre de la GetVersionInfo propriete accesseur de la fonction peut etre de façon transparente, simple et retourne un tableau de la valeur a l'indice fourni. La coutume cles qui pourraient en outre etre fourni, nous allons simplement appeler l'API de commande pour extraire les details de la version de l'information de la memoire tampon. Bien que ce sera un peu plus lent que l'acces a l'details directement a partir d'une pre-calculees de tableau, il n'est pas prevu que ces proprietes seront frequemment consultees et c'est donc une conception acceptable de decision. Le Listing 3 montre l'implementation de la classe.
constructeur TVersionInfo.Creer (ThisSourceFile: String)
const
& nbsp & nbsp VersionKeyNames: array [0..MaxVersionKeys] of String =
& nbsp & nbsp & nbsp ('Societe', 'FileDescription', 'FileVersion', 'InternalName',
& ! & ! & ! & ! 'LegalCopyright', 'LegalTrademarks', 'OriginalFilename',
& ! & ! & ! & nbsp 'ProductName', 'ProductVersion', 'Commentaires')
var
& nbsp & nbsp ThisInfo: Integer
& nbsp & nbsp InfoLength: UINT
& nbsp & nbsp Len: DWORD
& nbsp & nbsp Poignee: DWORD
& nbsp & nbsp PCharset: PLongInt
begin
& nbsp & nbsp herite de Creer
& nbsp & nbsp // recuperation de la taille de la version info
& nbsp & nbsp Len := GetFileVersionInfoSize (PChar (ThisSourceFile), la Poignee)
& nbsp & nbsp // allocation de la VersionInfo taille de la memoire tampon
& nbsp & nbsp SetLength (VersionInfo, Len 1)
& nbsp & nbsp // Obtenir les informations de version
& nbsp & nbsp si GetFileVersionInfo (PChar(ThisSourceFile), Poignee, Len,
& ! & ! & ! & nbsp Pointeur(VersionInfo))
& nbsp & nbsp commencer
& ! & ! & ! & nbsp // Obtenir la traduction d'informations pour la Langue / CharSet Id
& ! & ! & ! & nbsp si VerQueryValue(PointerVersionInfo), '\VarFileInfo\Translation',
& ! & ! & ! & ! & ! & nbsp Pointeur(PCharset), InfoLength)
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp LangCharset := Format ('%.4x%.4x',
& ! & ! & ! & ! & ! & ! & ! & nbsp [LoWord (PCharset^), HiWord (PCharset^)])
& ! & ! & ! & ! & ! & nbsp InfoAvailable := True
& ! & ! & ! & ! & ! & nbsp // Obtenez la version standard de l'information
& ! & ! & ! & ! & ! & nbsp pour ThisInfo := De 0 a MaxVersionKeys ne
& ! & ! & ! & ! & ! & ! & ! & nbsp StandardKeys[ThisInfo] :=
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp GetKey(VersionKeyNames[ThisInfo])
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin
fin
fonction de TVersionInfo.GetKey (ThisKeyName: string): string
var
& nbsp & nbsp InfoLength: UINT
begin
& nbsp & nbsp si InfoAvailable puis
& nbsp & nbsp commencer
& ! & ! & ! & nbsp SetLength (Resultat, 255)
& ! & ! & ! & nbsp si VerQueryValue (Pointeur(VersionInfo),
& ! & ! & ! & ! & ! & nbsp PChar(Format('\StringFileInfo\%s\%s',
& ! & ! & ! & ! & ! & nbsp [LangCharset, ThisKeyName])), (Pointeur)
& ! & ! & ! & ! & ! & nbsp InfoLength) puis
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp SetString(Resultat, PChar(Suite), InfoLength - 1)
& ! & ! & ! & nbsp fin else
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp Resultat := '
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin else
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Result := 'N/A'
& nbsp & nbsp fin
fin
fonction de TVersionInfo.GetVersionInfo(Index: Integer): string
begin
& nbsp & nbsp Resultat := StandardKeys[Index]
fin
procedure TVersionInfo.SetVersionInfo(Index: Integer
& nbsp & nbsp Value: string)
begin
& nbsp & nbsp StandardKeys[Index] := Valeur
fin
fonction de TVersionInfo.GetBuildNumber: string
begin
& nbsp & nbsp // Bande le dernier element a partir de la version du fichier
& nbsp & nbsp Resultat := FileVersion
& nbsp & nbsp tandis que Pos ('.', Le resultat) > 0 do
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Resultat := Copy (Resultat, Pos ('.', Le resultat) 1, Longueur(Result))
& nbsp & nbsp fin
fin
l'Une des nuances de la façon dont les informations de version sont stockees dans des ressources de l'application de la section, c'est qu'il est possible de definir la langue de jeu de caracteres a ete utilise pour creer les informations de version (et l'application ou la DLL elle-meme). Cela est defini dans les informations de version comme un double mot, ou 32 bits entier non signe, et doivent etre presents dans le cadre de l'information sur la version de la chaîne (au format hexadecimal) pour chaque cle qui est extrait. L'un des emplois du constructeur, ainsi que l'extraction de l'information de version dans un tampon de chaîne (un moyen pratique de stocker statique des donnees renvoyees par les appels de l'API) est d'extraire la langue et le jeu de caracteres de l'information et de construire une bonne chaîne hexadecimale qui seront utilisees dans les futurs appels a VerQueryValue. Une fois que cela a ete fait, le constructeur fait alors un appel a la routine qui renvoie une information de version de la valeur pour une cle fournie. Cette routine une double vie, en outre, se faisant passer pour la fonction d'accesseur pour la propriete de la Cle. Encore une fois, un aspect interessant de ce processus est que le constructeur obtient une liste de la cle standard noms aupres d'une constante chaîne de caracteres fixe tableau qui est declaree et definie dans un seul enonce. C'est aussi un peu utilise, mais tres pratique, technique qui est egalement autorisee pour les variables globales, ainsi que des constantes.
Si vous referer a la Figure 1, vous pouvez voir certains d'appoint informations de controle de version dans le groupe appele 'les attributs de Module', un ensemble d'indicateurs decrivant l'etat de la demande, si c'est un debug ou prives construire et ainsi de suite. Cette information est egalement disponible dans le fichier de ressources, et peut etre consulte a l'aide de l'API de VerQueryValue de commande, mais avec un deuxieme parametre de '\', plutot que '\VarFileInfo\' Traduction'. Dans ce cas, ce qui est retourne est un pointeur vers une structure qui contient des details sur le type de fichier et le contenu, double paires de mots qui peuvent etre combines pour representer une stricte 64 bits numero de version utilise pour le strict comparaisons numeriques (par des programmes d'installation) ainsi que les attributs de Module definissable dans Delphi. Ce serait une tache simple pour etendre la TVersionInfo constructeur pour extraire cette information et de l'exposer a l'aide de simples proprietes Booleennes et, dans Delphi 5, Int64 types de propriete pour la stricte numeros de version.
Cette capacite a encapsuler l'acces a des structures de donnees complexes via une interface pratique est l'une des beautes de l'Orientation de l'Objet, et que l'on sera continuellement de retour. La classe definie ici a deja expose le numero de build comme une separation de biens, lui-meme derive a partir du dernier element de FileVersion de fournir aux utilisateurs de la classe avec les donnees d'une maniere commode. Par exemple, une utilisation appropriee de ce serait sur la zone a Propos d'une application, montrant non seulement le nom de l'application et les droits d'auteur, mais aussi la version du programme et le numero de build pour reference facile.
Pour terminer notre examen d'un processus de construction, il serait tres bien si, apres avoir effectue avec succes, il pourrait incrementer le numero de version (et eventuellement numero de version) dans les informations de version de tous les livrables. Delphi apparaît pour stocker ces informations de version dans le .DOF fichier qui accompagne le projet, c'est dans le fichier INI de format et contient la plupart des details exposes par le Projet | boîte de dialogue Options. Cependant, par programme a apporter des modifications a ce fichier (il y a des entrees dans la [Version Info] la section pour des choses comme MajorVer, la Liberation et ainsi de suite) ne le fait pas suite a des modifications a l'application compilee. C'est parce que Delphi genere le fichier de ressources compiles (du Projet.RES) a partir de cette information que lorsqu'elle est modifiee de maniere interactive a partir de l'interieur de Delphes lui-meme. L' .RES compile fichier de ressources est simplement liee a l'application au moment de la compilation, afin d'apporter des changements a la .DOF fichier, puis recompiler l'application ne cause pas le fichier de ressources a regenerer et a la sortir de la date qui est utilisee. Il est de bonne pratique donc pour mettre a jour l'accumulation et la liberation des nombres de chaque projet Delphi par part a la fin de chaque generation reussie.
Dans l'article suivant, nous allons commencer a concevoir les classes que nous aurons besoin de produire un veritable orientee objet application, l'encapsulation des objets metiers et de base de donnees access dans un tres productif. Ce sera l'un des principaux odyssee couvrant presque tous les aspects du developpement d'applications Windows.
Suivant dans la serie


En ajoutant les informations de version pour les applications

En ajoutant les informations de version pour les applications : Plusieurs milliers de conseils pour vous faciliter la vie.
Recommander aux amis
  • gplus
  • pinterest

Messages récents

Commentaire

Laisser un commentaire

évaluation