Informations de version d'un projet

Résolu
Signaler
Messages postés
228
Date d'inscription
lundi 5 avril 2004
Statut
Membre
Dernière intervention
25 octobre 2006
-
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
-
Bonjour,

Je souhaite récupérer les infos de version de mon projet et les afficher dans mon appli.

J'utilise l'exemple donné dans l'aide de delphi (Bouton help dans la fenètre Project Options, etc ...)

L'option de compilation {$R *.res} est présente dans la source du projet.
J'ai des infos introduites dans la grille 'key/value' de la fenètre Project Options
La case 'Include information in project' est cochée.

Cependant, je ne récupère aucune donnée.
En debuggant, je constate que l'expression : VerQueryValue(Buf, PChar('StringFileInfo\040904E4\' + InfoStr[i]), Pointer(Value), Len) est false.

Qu'est ce que je n'ai pas compris ??

Et comme disait ma grand-mère : il y a toujours du soleil derrière les nuages.

Vincent Stryckmans

17 réponses

Messages postés
228
Date d'inscription
lundi 5 avril 2004
Statut
Membre
Dernière intervention
25 octobre 2006

Comme aurait dit le prophète, la réponse est dans la question.

Le code donné dans l'aide de Delphi fonctionne au poil à condition de remplacer le local ID par celui donné dans le soptions du projet :

soit $080C pour Belgique / Français.

Et il faut remplacer
PChar('StringFileInfo\040904E4\' + InfoStr[i])

par

PChar('StringFileInfo\080C04E4\' + InfoStr[i]).

Vous aurez compris que cela change de pays en pays.

Allez, cela ne servait à rien de se faire des ohohoh et autre n.c.

Merci pour vos réponses les gars

Et comme disait ma grand-mère : il y a toujours du soleil derrière les nuages.

Vincent Stryckmans
Messages postés
228
Date d'inscription
lundi 5 avril 2004
Statut
Membre
Dernière intervention
25 octobre 2006

Salut Julio,

A la compilation du package dans lequel j'ai inclus ton composant, Delphi 7 Entreprise déclare ne pas trouvé strman.dcu.

Quid ?

Et comme disait ma grand-mère : il y a toujours du soleil derrière les nuages.

Vincent Stryckmans
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Il faut que tu inclue le chemin de ce fichier dans le chemin des Bibliothèques.

Outils=>Options de l'environnement

j!nH
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Le StrMan.pas est dispo ici : http://diabloporc.free.fr/delphi/strman/
bonnne prog

>>>>>>>> N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! ;)

-------------------------------------------
http://diabloporc.free.fr : mon site refait ! Delphi power !
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Je propose un code. Je ne sais plus trop où je l'ai trouvé, mais il semble bien marcher... histoire d'un vieux test.

procedure GetExeVersion(NameExe: string; var L1, L4: string);
var dwVerHandle, nStrLong : integer;
    cStartBuf             : array[0..4] of char;
    CresBuf               : array[0..255] of char;
    dwVerSize, hMem       : integer;
    LpData                : Lpstr;
    cc                    : string;
    Lp                    : Pointer;
begin
  dwVerSize:= GetFileVersionInfoSize(PChar(NameExe),dwVerHandle);
  hMem:=GlobalAlloc(GMEM_ZEROINIT,dwVerSize+100);
  LpData:=Globallock(hMem);
  try
    GetFileVersionInfo(PChar(NameExe),dwVerHandle,dwVerSize,LpData);
    if not VerQueryValue(LpData,'\VarFileInfo\Translation',Lp,nStrLong) then
      Exit;
    StrPcopy(cStartBuf,PChar(Lp));
    cc:=Format('\StringFileInfo\%.2x%.2x%.2x%.2x\', [byte(cStartBuf[1]),
    Byte(cStartBuf[0]),
    Byte(cStartBuf[3]),
    Byte(cStartBuf[2])]);
    StrCopy(CresBuf,Pchar(cc+'FileVersion'));
    if VerQueryValue(LpData,CresBuf,Lp,nStrLong) then
      begin
        StrPcopy(CresBuf,PChar(Lp));
        L1:= format('Version %s.%s.%s.%s',[CresBuf[0],CresBuf[2], CresBuf[4], CresBuf[6]]);
        StrCopy(CresBuf,Pchar(cc + 'LegalCopyright'));
      end;
    if VerQueryValue(LpData,CresBuf,Lp,nStrLong) then
      begin
        StrPcopy(CresBuf,PChar(Lp));
        L4:=StrPas(CresBuf);
      end;
  finally
    GlobalUnLock(hMem);
  end;
end;


===========
Validez les réponses si ok...

ViewVite : HTML - ZIP
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
c justement l'interet d emon compo : ne pas se taper ces copier coller a chaque fois qu'on en a besoin.
et puis StrMan c comme JEDI VCL : tous le monde devrait les avoir ! c vraiment extra

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! ;)

-------------------------------------------
http://diabloporc.free.fr : mon site refait ! Delphi power !
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Le Jedi et ses amis ne sont pas avec moi... C'est bizarre parce que ça me dit rien. Mais après tout pourquoi pas... Au moins là c'est visible :-p 8-)

===========
ViewVite : HTML - ZIP
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
n.c.
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Fallait préciser lesquelles infos tu voulais... la version ou les infos version. C'est pas pareil ! :(

Sinon, faudrait aussi détailler la réponse à ta question, car c'est pas très clair... Car soudainement tout cela m'intéresse. :blush)

===========
ViewVite : HTML - ZIP
Messages postés
228
Date d'inscription
lundi 5 avril 2004
Statut
Membre
Dernière intervention
25 octobre 2006

Cher Grandvizir,

Si tu regardes l'exemple donné dans l'aide Delphi depuis le bouton Help de la fenêtre des options du projet, il est possible de récupérer les infos suivantes :
'CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments'

que l'on peut encoder dans la grille key/value de la même fenêtre.

L'astuce que moi y en avait pas compris :big) est que la codification des ces données change selon le code de langage de l'application.
Code qui est donné dans la même fenêtre dans le groupbox
Language - Locale ID

Bref, il fallait adapter le code de l'exemple tel que je l'ai cité dans ma réponse précédente.

Je dois avouer, accepter mes humbles excuses, qu'accepter ma propre réponse était un peu présomptueux. %-6

@ +

Et comme disait ma grand-mère : il y a toujours du soleil derrière les nuages.

Vincent Stryckmans
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Déjà, c'est déjà plus trop ce que je croyais. ?-)

Je connais très bien les infos version, en revanche, je les trouve irrécupérables via une programmation Delphi 3.

A quel endroit mettre... ?
PChar('StringFileInfo\080C04E4\' + InfoStr[i])

Techniquement: pourrait-il y avoir un petit code source illustrant la question ? Je crois, que c'est la meilleure chose à faire.

Je me suis déjà amusé à mettre l'ID japonais. Et je ne vois toujours pas ce que ça a changé: ça dit entre autre d'où vient l'exe. :big) :big)

===========
ViewVite : HTML - ZIP
Messages postés
228
Date d'inscription
lundi 5 avril 2004
Statut
Membre
Dernière intervention
25 octobre 2006

Voilà le code source que j'utilise cher grandvizir :

unit project_info;

interface
procedure lire_project_info;

implementation
uses windows, forms, sysutils, variable, classes;

procedure lire_project_info;
const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');
var
S: string;
n, Len, i: longword;
Buf: PChar;
Value: PChar;
begin
// Lecture des informations du projet
projectinfo := TStringList.Create;
projectinfo.clear;

S := Application.ExeName;
n := GetFileVersionInfoSize(PChar(S),n);
if n > 0 then
begin
Buf := AllocMem(n);
GetFileVersionInfo(PChar(S), 0, n, Buf);
for i := 1 to InfoNum do
if VerQueryValue(Buf, PChar('StringFileInfo\080c04E4\' + InfoStr[i]), Pointer(Value), Len) then
projectinfo.Add('Project.'+InfoStr[i] + '=' + Value)
else
projectinfo.add('Project.'+Infostr[i] + '=');
FreeMem(Buf, n);
end
else // si aucune info enregistrée
for i := 1 to Infonum do projectinfo.add('Project.'+Infostr[i] + '=');

end; // procedure lire_project_option;
end.

Pour récupérer les infos lues, il ter suffit de lire la stringlist comme ceci :

projectinfo.values['project.CompanyName'] et tu récupereras le nom de la compagnie, et ainsi de suite ...

Et comme disait ma grand-mère : il y a toujours du soleil derrière les nuages.

Vincent Stryckmans
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Je vais donc bosser dessus...

Remarque: si cet exemple est bien, autant le mettre en code source !! ;)

===========
ViewVite : HTML - ZIP
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
ce qui serait interessant c'est de trouver qqs codes pays pour pouvoir modifier mon compo (puisque ce code est deja un code source ds mes sources :D)

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! ;)

-------------------------------------------
http://diabloporc.free.fr : mon site refait ! Delphi power !
Messages postés
228
Date d'inscription
lundi 5 avril 2004
Statut
Membre
Dernière intervention
25 octobre 2006

Un ou deux truc que j'ai oublié dans ma dernière explication :

1. Dans mon code, je déclare une unit variable.
Dans mon projet, elle continet les variables et constantes communes à dont projectinfo déclarée comme Tstringlist.

2. Pour les appli console, l'option de compilation {$R *.res} doit être présente dans la source du projet.

Pour les code de langage, l'info se trouve dans le fichier d'aide du MS SDK : ISAPI Programmer's reference à l'index 'Language indentifiers'.

Pour les ceusses qui n'aurait pas se fichier hlp, voici les codes :

Identifier Locale
0x0000 Language Neutral
0x0400 Process Default Language
0x0401 Arabic (Saudi Arabia)
0x0801 Arabic (Iraq)
0x0c01 Arabic (Egypt)
0x1001 Arabic (Libya)
0x1401 Arabic (Algeria)
0x1801 Arabic (Morocco)
0x1c01 Arabic (Tunisia)
0x2001 Arabic (Oman)
0x2401 Arabic (Yemen)
0x2801 Arabic (Syria)
0x2c01 Arabic (Jordan)
0x3001 Arabic (Lebanon)
0x3401 Arabic (Kuwait)
0x3801 Arabic (U.A.E.)
0x3c01 Arabic (Bahrain)
0x4001 Arabic (Qatar)
0x0402 Bulgarian
0x0403 Catalan
0x0404 Chinese (Taiwan)
0x0804 Chinese (PRC)
0x0c04 Chinese (Hong Kong)
0x1004 Chinese (Singapore)
0x0405 Czech
0x0406 Danish
0x0407 German (Standard)
0x0807 German (Swiss)
0x0c07 German (Austrian)
0x1007 German (Luxembourg)
0x1407 German (Liechtenstein)
0x0408 Greek
0x0409 English (United States)
0x0809 English (United Kingdom)
0x0c09 English (Australian)
0x1009 English (Canadian)
0x1409 English (New Zealand)
0x1809 English (Ireland)
0x1c09 English (South Africa)
0x2009 English (Jamaica)
0x2409 English (Caribbean)
0x2809 English (Belize)
0x2c09 English (Trinidad)
0x040a Spanish (Traditional Sort)
0x080a Spanish (Mexican)
0x0c0a Spanish (Modern Sort)
0x100a Spanish (Guatemala)
0x140a Spanish (Costa Rica)
0x180a Spanish (Panama)
0x1c0a Spanish (Dominican Republic)
0x200a Spanish (Venezuela)
0x240a Spanish (Colombia)
0x280a Spanish (Peru)
0x2c0a Spanish (Argentina)
0x300a Spanish (Ecuador)
0x340a Spanish (Chile)
0x380a Spanish (Uruguay)
0x3c0a Spanish (Paraguay)
0x400a Spanish (Bolivia)
0x440a Spanish (El Salvador)
0x480a Spanish (Honduras)
0x4c0a Spanish (Nicaragua)
0x500a Spanish (Puerto Rico)
0x040b Finnish
0x040c French (Standard)
0x080c French (Belgian)
0x0c0c French (Canadian)
0x100c French (Swiss)
0x140c French (Luxembourg)
0x040d Hebrew
0x040e Hungarian
0x040f Icelandic
0x0410 Italian (Standard)
0x0810 Italian (Swiss)
0x0411 Japanese
0x0412 Korean
0x0812 Korean (JoHab)
0x0413 Dutch (Standard)
0x0813 Dutch (Belgian)
0x0414 Norwegian (Bokmal)
0x0814 Norwegian (Nynorsk)
0x0415 Polish
0x0416 Portuguese (Brazilian)
0x0816 Portuguese (Standard)
0x0418 Romanian
0x0419 Russian
0x041a Croatian
0x0c1a Serbian
0x041b Slovak
0x041c Albanian
0x041d Swedish
0x081d Swedish (Finland)
0x041e Thai
0x041f Turkish
0x0421 Indonesian
0x0422 Ukrainian
0x0423 Belarusian
0x0424 Slovenian
0x0425 Estonian
0x0426 Latvian
0x0427 Lithuanian
0x081a Serbian
0x0429 Farsi
0x042d Basque
0x0436 Afrikaans
0x0438 Faeroese

Attention : lire aide de deplhi à propos du langage de l'appli :

You can only choose a language that is listed in the Control Panel Regional Settings dialog of your computer. Some versions of the Windows operating system do not include support for all languages (such as Far Eastern languages), and you may need to install the appropriate Language Pack before you can use those languages.

Et comme disait ma grand-mère : il y a toujours du soleil derrière les nuages.

Vincent Stryckmans
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Les correspondances ID Locales sont disponibles dans la base de registre. Trouvez la clé, car je ne sais plus.

===========
ViewVite : HTML - ZIP
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
liste ds la BDR :
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Rfc1766

son code pays :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\Nls

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! ;)

-------------------------------------------
http://diabloporc.free.fr : mon site refait ! Delphi power !