IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Autorun qui verifie si Acrobat est présent sur le poste


Sujet :

Windows

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Autorun qui verifie si Acrobat est présent sur le poste
    Bonjour j'aurais aimé savoir comment faire dans un autorun par exemple pour verifier si il existe un acrobat sur le poste dans lequel le cd est inséré:

    - si il y est on lance un fichier pdf sur le cd
    - sinon on lance l'intall qui est sur le cd aussi

    2 solutions m'ont été proposé: une ou il s'agit de verifier si le type de fichier pdf est associé à une appli ou non, l'autre étant de verifier dans la base de registre si un reader est présent....

    Quelqu'un pourrais-t-il me donner un exemple de script que je pourrai mettre en oeuvre.

    Merci d'avance


  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Personne n'a d'idées....

    J'aimerai faire un autorun qui lance donc un batch dos...

    ce batch contiendrai un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    list= ("SOFTWARE\ADOBE\Acrobat Reader\","HKEY_LOCAL_MACHINE") 
    if list<"6.0" then open "InstallAcrobat70.exe" 
    else
    open Doc.pdf
    end if 
    end
    Voila c'est pas très parlant mais l'idée est là

    Merci de m'aider

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Quelque pistes (issues de la prochaine FAQ Delphi).

    La première ne fonctionne pas sur toutes les versions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    Function GetFileVersion(const FileName: string):String;
    const
      VersionInfo: array [1..8] of string
          = ('FileDescription', 'CompanyName'   , 'FileVersion',
             'InternalName'   , 'LegalCopyRight', 'OriginalFileName',
             'ProductName'    , 'ProductVersion');
    var
      Handle   : DWord;
      Info     : Pointer;
      InfoData : Pointer;
      InfoSize : LongInt;
      DataLen  : UInt;
      LangPtr  : Pointer;
      InfoType : string;
    begin
      { Demande de la taille nécessaire pour stocker les infos de Version}
      InfoSize:=GetFileVersionInfoSize(PChar(FileName), Handle);
      if (InfoSize > 0) then
      begin
        { Réservation de la mémoire nécessaire}
        GetMem(Info, InfoSize); 
    
        try 
          if GetFileVersionInfo(PChar(FileName), Handle, InfoSize, Info) then 
          begin
    
              InfoType := VersionInfo[3]; 
              if VerQueryValue(Info,'\VarFileInfo\Translation',LangPtr, DataLen) then 
                InfoType:=Format('\StringFileInfo\%0.4x%0.4x\%s'#0,[LoWord(LongInt(LangPtr^)), 
                                             HiWord(LongInt(LangPtr^)), InfoType]); 
              if VerQueryValue(Info,@InfoType[1],InfoData,Datalen) then
              Result :=  strPas(InfoData); 
    
          end; 
        finally 
          FreeMem(Info, InfoSize); 
        end;
      end; 
    end; 
    
    Function GetAcrobatReaderVersion : Integer; 
    Var 
    Reg : TRegistry;
    CLSID,Path_Reader : String;
    ListVer : TStringList;
    Begin
    ListVer := TStringList.Create;
    Result := 0; 
    Reg := TRegistry.Create;
    Reg.RootKey := HKEY_LOCAL_MACHINE;
      If Reg.OpenKeyReadOnly('SOFTWARE\Adobe\Acrobat Reader') then
      begin
        Reg.GetKeyNames(ListVer);
        Reg.CloseKey;
    
        If Reg.OpenKeyReadOnly('SOFTWARE\Adobe\Acrobat Reader\'+ListVer[ListVer.count-1]+'\Installer') then
        Path_Reader := Reg.ReadString('Path')+'\Reader\AcroRd32.exe' ;
    
    
    
             If FileExists(Path_Reader) then begin
               Try 
               Result := StrToInt(GetFileVersion(Path_Reader)[1]) ;
               Except 
               ShowMessage(Format('Une erreur vient de se produire lors de la lecture de la version du fichier %s',[Path_Reader]));
               end;
             end else
             ShowMessage(Format('Le fichier %s n''existe pas',[Path_Reader]))
      end else
      ShowMessage('Adobe Acrobat Reader n''est pas installé sur cette machine');
    
    Reg.Free;
    ListVer.Free;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ShowMessage('La version d''Acrobat Reader est la '+Inttostr(GetAcrobatReaderVersion));
    end;
    La seconde par DelphiProg :
    Autre méthode possible : interroger directement Acrobat Reader.

    Pour cela, faites Composants|Importer un contrôle activeX et sélectionnez le contrôle ActiveX qui correspond à votre version d'Acrobat Reader :
    "Adobe Acrobar reader 7.0 browser control type libray 1.0" (dans mon cas).
    Ensuite, cliquez sur le bouton "Créer l'unité".
    Delphi crée alors une unité nommée AcroPdfLib_tlb.pas contenant la déclaration suivante : TAcroPDF = class(TOleControl).
    C'est cette classe que nous allons utiliser, et plus particulièrement sa méthode getVersions.

    La démarche est volontairement décomposée en deux étapes. La procédure GetAcrobatValues remplit List avec les différents noms et valeurs renvoyées par l'objet TAcroPdf.
    La fonction renvoie la valeur de l'élément EntryName ou une chaîne vide si non trouvée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    uses AcroPDFLib_TLB;
    
    {$R *.dfm}
    {Renvoie True si Acrobat reader est installé, sinon renvoie false}
    function GetAcrobatValues(List: TStrings): boolean;
    var
      Pdf: TAcroPDF;
    begin
      Result := False;
    
      Pdf := TAcroPDF.Create(nil);
      try
        try
          List.DelimitedText := Pdf.GetVersions;
          Result := True;
        except
          ShowMessage('Adobe Acrobat reader non trouvé');
        end; {try..except}
      finally
        Pdf.Free;
      end; {try..finally}
    end;
    
    {Renvoie, sous forme d'une chaîne de caractères, le numéro de version
    correspondant à EntryName (LegalPDF par défaut).}
    function GetAcrobatVersion(const EntryName: string = 'LegalPDF'): string;
    var
      List: TStringList;
    begin
      Result := EmptyStr;
      List := TStringList.Create;
      try
        if GetAcrobatValues(List) then
        try
          Result := List.Values[EntryName];
        except
          Result := EntryName + ' non trouvé';
        end; {try..except}
      finally
        List.Free;
      end; {try..finally}
    end;
    Exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      //Affiche la valeur de LegalPDF
      Label1.Caption := GetAcrobatVersion('LegalPDF');
      //Récupère la liste des noms et valeurs dans un TMemo
      GetAcrobatValues(Memo1.Lines);
    end;
    En pratiquant ainsi, on peut s'affranchir des problèmes d'entrée de bases de registre qui ne sont pas constantes.
    Maintenant d'effectuer ce traitement en batch...
    Peut être plus simple en parsant le résultat de la commande suivante :

    D:\backup>Fichier.pdf

    D:\backup>Fichier.pdc
    'Fichier.pdc' n'est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.

    D:\backup>
    Sous XP la premiére exécute AcrobatReader

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Bonjour Laurent,

    Merci pouyr ta réponse mais cela est un peu complexe pour moi .... le delphi..

    J'aimerai juste faire un test en script batch par exemple qui teste si la version de l'acrobat est superieure à la 6.0, on lance mon fichier pdf, sinon on lance l'installation du reader 7.0 présent sur le cd....

    Merci....

  5. #5
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    J'ai trouve ça qui peut peut etre t'aider:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set objShell = WScript.CreateObject("WScript.Shell" ) 
    reg_val1 = objShell.RegRead _ 
        ("CLEF OU IL Y A LA VERSION DE AREADER" ) 
    Wscript.Echo reg_val1
    Ces lignes peuvent être mises dans un fichier nommé "get_reg.vbs". Ce fichier peut ensuite être appelé depuis un ".bat" avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cscript /nologo get_reg.vbs
    Sinon en batch pur je vois pas comment interroger la base de registre.

    Autre solution, j'imagine qu'il doit bien y avoir un fichier texte/html quelque part avec le num de version de reader (fichier de liscence, aide ou autre). Donc tu peux toujours faire un recherche globale sur le disque mais ça risque d'être tres long... (Trop à mon avis).

    Reste la solution de Laurent à la fin de son poste, mais cette solution ne te permet pas d'avoir la version.


    Edit>
    Une méthode que je viens de trouver qui consiste à exporter la base de registre dans un fichier temp avant de parser ce dernier:
    http://www.robvanderwoude.com/files/readreg_nt.txt


    Enfin autre méthode mais qui ne marche pas chez moi (il me manque la commande reg qui est récuperable sur le net). Ici ça récupere le num du sp de windows. C'est à mon avis la meilleure solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for /f "skip=3 tokens=5" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion') do call :command %%a 
     
     
    :command 
    set valeur=%1 
    if %valeur% equ "" goto :eof 
    echo %valeur% 
    PAUSE

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Salut Drizzt,

    Merci pour ta réponse, j'ai testé la première méthode que tu m'a dite, voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set objShell = WScript.CreateObject("WScript.Shell" ) 
    reg_val1 = objShell.RegRead _ 
        ("HKEY_LOCAL_MACHINE\SOFTWARE\ADOBE\Acrobat Reader" ) 
    Wscript.Echo reg_val1
    cela ne marche pas car il me dit que cela est impossible de trouver la clé...

    Merci de m'aider car je ne peux pas aller plus loin dans le chemin de clé de registre car cela peut etre le reader 5.0 ou 6.0 ou 7.0 et c'est justement ça que j'aimerai savoir...

    Après une fois dans le btach comment récupérer cette valeur et faire un test dessus:
    si reg_val1 > "6.0" shellexecute=mondoc.pdf
    sinon open intallreader7.0.exe

    Merci de m'aider.... a conclure ce problème...

  7. #7
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Je te conseille plutot d'utiliser la derniere méthode meme si elle nécessite d'inclure un executable en plus. Au moins ça reste du full batch

    Sinon pour ta méthode le mieux est que tu testes chaque clef (celle pour la version 5.0, celle pour la 6.0 ...) comme ça si il te revoie rien c'est que la clef n'existe pas, sinon c'est que tu as trouve.

    Pour récuperer l'info tu peux la rediriger vers un fichier text par ex.

    Un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cscript /nologo get_reg.vbs > result.txt
    set key=<result.txt
    del result.txt
    (J'arrive pas à mettre directement dans une variable d'environnement, si quelqu'un sait je suis preneur, j'ai essaye avec des | mais ça ne marche pas)

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Oula désolé mais je suis encore un peu paumé la ....

    Pour ta dernière methode, je n'ai pas trouver l'exécutable et puis cale teste la version de windows alors que je desire tester un Adobe reader, merci de me donner plus d'info...

    Sinon je me suis pencher sur ce que j'ai commencer et c'est pas très brillant voici ce que j'ai en script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set objShell = WScript.CreateObject("WScript.Shell" ) 
    reg_val1 = objShell.RegRead _ 
        ("HKEY_LOCAL_MACHINE\SOFTWARE\ADOBE\Acrobat Reader\6.0\AdobeViewer\EULA" ) 
    reg_val2 = objShell.RegRead _ 
        ("HKEY_LOCAL_MACHINE\SOFTWARE\ADOBE\Acrobat Reader\7.0\AdobeViewer\EULA" ) 
    Wscript.Echo reg_val1
    Wscript.Echo reg_val2
    et voici mon bat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     cscript /nologo get_reg.vbs > result.txt
    set key=<result.txt
    del result.txt
    PAUSE
    Comment faire dire dans mon test en script que: si il trouve une version 6.0 ou 7.0 dans le bat il lance un pdf et si il trouve aucun des 2 il lance une install de adobe reader....

    Merci d'avance si q<uelqu'un peut bien m'expliquer de A à Z ça serait top.

    Merci d'avance....

  9. #9
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Arf mais mon bat fallait pas le prendre tel quel, c'était juste pour te donner un exemple de comment recuperer le resultat.

    Ton script VB il fait des echos en sortie, donc en gros il affiche dans ta console.
    En ajoutant > fichier.txt à la fin de l'appel de ton script, tu rediriges la sortie de ton script VB dans un fichier texte. Comme ça une fois ton script VB fini, ton batch va pouvoir lire dans ce fichier les infos.

    Ensuite pour tester il y a plein de méthodes.
    Tu peux utiliser findstr (dans ce cas on doit d'ailleurs pouvoir se passer du fichier texte avec un | )
    Tu peux faire un FOR /F en definissant bien les tokens et les delims
    Tu peux tester la taille du fichier
    ...
    Rappel: nom_commande /? pour avoir tout plein d'infos sur comment s'en servir.


    Tout ça dépend de la chaine de caractere que ton script VB va te renvoyer en cas de succes ou d'echec. Une méthode pourra etre plus ou moins adaptée.

    Si vraiment tu n'y arrives pas, donne les output du script VB dans le cas ou les clefs existent et dans le cas ou elles n'existent pas.


    ----

    Sinon pour l'autre méthode, l'excutable se trouve en 10sec avec Google et il ne faut pas etre un genie pour changer la recherche de la version du sp de windows en ce que tu veux. Avec un minimum de recherche tu devrais y arriver. Mets y un peu du tiens aussi

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Drizzt [Drone38]
    (J'arrive pas à mettre directement dans une variable d'environnement, si quelqu'un sait je suis preneur, j'ai essaye avec des | mais ça ne marche pas)
    Si le code
    cscript /nologo get_reg.vbs
    renvoie une seule ligne place le dans une boucle for
    For /F "tokens=*" %%I in ('cscript /nologo get_reg.vbs') do set result=%%I
    De tester toutes les versions d'AR fige ton batch à la derniére version connue lors de la création de ce batch.

  11. #11
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Effectivement oui j'aurais pu y penser . Thx pour la soluce je saurais si un jour j'ai besoin comme ça.

    De tester toutes les versions d'AR fige ton batch à la derniére version connue lors de la création de ce batch.
    True ! Effectivement ça serait mieux de recuperer juste le num de la version et de faire une comparaison par rapport à une version de reference.
    Avec toutes les méthodes décrites plus haut ça doit etre faisable sans trop de heurts

  12. #12
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Bonjour Messieurs,

    Merci pour toutes ces infos, mais moi qui ne suis absolument pas développeur, j'aimerai que vous me disiez laquelle de solution est plus facile à mettre en place...

    Un batch complet du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for /f "skip=3 tokens=5" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion') do call :command %%a 
     
     
    :command 
    set valeur=%1 
    if %valeur% equ "" goto :eof 
    echo %valeur% 
    PAUSE
    ou un bat + vbs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For /F "tokens=*" %%I in ('cscript /nologo get_reg.vbs') do set result=%%I
    Merci de m'aider dans ma démarche car j'ai un peu du mal à vous suivre ...

    J'aimerai faire un simple if en batch qui verifie dans la base de registre si AR est superieur à la version 6.0 on lance un pdf sinon on l'installe à partir d'un éxécutable sur le cd...

    Merci d'avance pour votre aide...

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 12
    Points
    12
    Par défaut

  14. #14
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Les deux solutions sont, à mon sens, de la meme difficulté à mettre en place.
    Choisit en une et fait des recherches sur la méthode proposée pour lire la base de registre.

    Tu as toutes les billes pour trouver la.

    Dsl mais j'ai pas le temps de pousser la recherche plus loin de mon coté.

Discussions similaires

  1. [WD17] Comment savoir si Outlook est présent sur la machine ?
    Par clocktime dans le forum WinDev
    Réponses: 3
    Dernier message: 24/01/2012, 08h16
  2. Réponses: 2
    Dernier message: 17/11/2008, 11h22
  3. vérifier si groupe local est présent sur un PC
    Par poussin_44 dans le forum VB.NET
    Réponses: 3
    Dernier message: 01/08/2007, 15h44
  4. Réponses: 2
    Dernier message: 10/01/2007, 17h28
  5. Autorun qui verifie si Acrobat est présent sur le poste
    Par bichonjp dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 24/07/2006, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo