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

Runtime Discussion :

Pertinence d'une démarche de distribution d'une application


Sujet :

Runtime

  1. #1
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut Pertinence d'une démarche de distribution d'une application
    Bonjour,

    Mon appli est (enfin) prête à la distribution. Pour cela, j'ai utilisé l'assistant Package réalisé par Argyronet (qu'il en soit ici, une fois encore, remercié !)
    Mais, je me suis heurté à un autre problème: Du fait que je vais distribuer mon application sous forme de démo (un peu style shareware), je ne saurai pas si mon client potentiel a sur son poste MS-Access ou non.
    Plutôt que de (encore...) demander à Argyronet de nous concocter une solution, j'ai décidé de retrousser mes manches pour trouver une solution à cela... mais je ne suis pas sûr de mon coup, c'est la raison de mon post, j'ai besoin d'avis de personnes plus expérimentées que moi dans ce domaine !

    Situation:
    Dans le répertoire racine de mon support, j'ai créé deux répertoires:

    • Un contenant un package avec le runtime,
    • L'autre sans.

    Pour savoir quel package utiliser, j'ai donc créé un fichier batch qui va tenter d'ouvrir une base "accdb" sur le poste du client.
    a. Si la base s'ouvre, c'est que MS-Acces est installé (of course...) ainsi il va lancer l'installation sans runtime.
    b. Si au contraire une erreur est détectée à l'ouverture de cette base, c'est la version avec runtime qui va être exécutée.

    Voici donc le contenu et la structure du support de mes deux répertoires (les "..." étant la lettre du lecteur concerné):
    1: ... Autorun.inf
    2: ... Setup.bat
    3: ... Base.accdb
    4: ...\Acc\Setup.exe
    5: ...\Acc\Files
    6: ...\Rnt\Setup.exe
    7: ...\Rnt\Files

    Code pour Autorun.inf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [autorun]
    open=Setup.bat  /AUTORUN
    Code pour Setup.bat:
    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
    @echo off
    
    REM Attribution du nom du disque courant (de la racine) à la variable "fold"  (C:, D:, ou autre)
    setlocal
    @for %%n in (%0) do set fold=%%~dpn
    chcp 1252
    
    REM Tentative d'ouvrir "base.accdb" (bdd vide) pour tester la présence ou non de MS-Access sur le poste du client
    Start /WAIT msaccess.exe %fold%\Base.accdb 2>/dev/null
    
    REM Interception de l'erreur:
    REM 1. S'il n'y a pas d'erreur on lance l'installation sans runtime
    REM 2. Si une erreur est interceptée, on installe avec le runtime
    if %ERRORLEVEL% NEQ 0 (
        goto :batch2
    ) else (
        goto :batch1
    )
    
    REM Installation sans runtime
    :batch1
    cls
    call %fold%\Acc\Setup.exe
    cls
    goto :fin
    
    REM Installation avec le runtime
    :batch2
    cls
    call %fold%\Rnt\Setup.exe
    cls
    goto :fin
    
    :fin
    endlocal
    exit
    Après quelques essais, je remarque que la condition du fichier batch n'est pas prise en compte... mais je ne suis (et de loin) pas spécialiste en ce domaine.. donc, si une bonne âme, connaissant ce type de commande voulais bien me suggérer une démarche.. :-)
    Je suppose qu'il faudrait un batch qui teste l'installation d'access (ainsi que sa version) car, je doute un peu de la pertinence d'ouvrir une base accdb pour tester la présence de MS-Access...
    Merci de vos avis et autres commentaires :-)
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    En fait l'approche est bonne mais pas la finalité :

    1. Déjà, le fait d'imposer un *.accdb n'est pas bon car vous partez du principe qu'il y a à minima Access 2007 ou ultérieure et si vous n'avez pas la version attendue de votre base.accdb (2016 par exemple), une erreur est levée et vous ne saurez pas intercepter l'existence d'Access. Donc, le mieux serait de fournir un mdb.
    2. Ensuite, en admettant que votre application base.accdb s'ouvre, cela ne veut pas dire que le poste possède Access 2016 et là, sans doute votre application n'est pas ouvrable dans une version antérieure.
    3. Enfin et surtout, si vous embarquez le Runtime dans votre package, le lancement de son installation sera de toute façon opéré mais il se peut aussi que selon le mode d'installation de 2016 (Démarrer en un clic par exemple), un message survienne et bloque l'installation.

      Nom : ClicToRun32.png
Affichages : 212
Taille : 12,5 Ko Nom : ClicToRun64.png
Affichages : 195
Taille : 14,1 Ko



    Un moyen efficace, si je puis dire, serait de biaiser en partant du même principe à savoir si Access 2016 est installé selon différent cas :
    • Donc lire dans le Registre son emplacement physique
      ou bien
    • Créer un VBS et tenter d'obtenir l'erreur 429 en essayant d'accéder au composant dans un VBS par exemple
      ou encore
    • Tenter de créer une nouvelle base Access via DBEngine dans un VBS par exemple
      (ces deux dernières options avec gestion d'erreur optimiste)
      ...

    et selon le réultat obtenu, agir sur le Setup.ini :
    • Supprimer la section [ChainedInstall_1] si Access est installé
    • La laisser s'il ne l'est pas.

      Bref un sujet pas simple à mettre en oeuvre mais réalisable...
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  3. #3
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Bonsoir et grand merci pour votre réponse
    Je vais donc m'orienter vers la lecture de la base de registre... dès que j'ai des résultats probants, je reviendrai poster ce que j'aurai trouvé :-)
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  4. #4
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Voilà...
    J'ai pompé à gauche et à droite, puis j'ai improvisé sur la base de mes connaissances VBA pour composer ce petit script VBS et cela fonctionne !
    L'avant-dernière question qui me reste à l'heure actuelle est la suivante: Est-ce que la clé que je recherche dans mon script est fiable pour tester la présence de MS-Access 16, 365 ?
    De toute façon, il faudra la modifier lorsque la prochaine version de MS-Access sortira...
    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
    Option explicit
     
    Dim Chemin
    Dim WshShell
    Dim MaVariable
    Dim ValeurCle
     
    Set WshShell = WScript.CreateObject("WScript.Shell")
     
    on error Resume Next
    'Lecture de la clé
    MaVariable = objShell.RegRead("HKCR\Applications\MSACCESS.EXE\FriendlyAppName")
    ValeurCle = InStr(1, MaVariable, "Office16")
     
    Chemin = Left(WScript.ScriptFullName, InStr(WScript.ScriptFullName, WScript.ScriptName)-1)
     
    If ValeurCle > 0 then
        WshShell.Run Chemin & "Acc\Setup.exe"
    Else
        WshShell.Run Chemin & "Rnt\Setup.exe"
    End If
     
    Set objShell = Nothing
    Si vous avez une meilleure idée pour la clé à rechercher, je suis preneur :-)
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  5. #5
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HKCR\Applications\MSACCESS.EXE\FriendlyAppName
    n'est pas une bonne piste car elle n'existe pas forcément.

    Je préconiserais volontiers ce point d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE
    La valeur Path renvoie le chemin et là, un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool = FSO.FileExist(strAccessExe)
    peut faire l'affaire.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  6. #6
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Hello !

    Après quelques temps de doute sur la clé proposée dans mon dernier post et moulte nouvelles recherches dans la base, je suis arrivé exactement à la même clé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE

    Par contre, je vais tout de même tester la valeur de cette clé afin de m'assurer qu'il s'agit bien de "Office 16" (ou supérieur) pour garantir le bon fonctionnement de mon appli (créée en v. 2016).

    Pardonnez-moi, mais je ne comprends pas vraiment votre proposition de code final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool = FSO.FileExist(strAccessExe)
    Je ne sais pas qu'en faire et je ne comprends pas non plus d'où vient la variable strAccessExe ?

    Dès que j'aurai avancé dans mon script, je le posterai...

    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  7. #7
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par bernardmichel Voir le message
    ... mais je ne comprends pas vraiment votre proposition de code final:... d'où vient la variable strAccessExe ?
    d'ici par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim oFSO
    Dim strAccessExe
     
    'Vérifie l'existence de la clé
    strAccessExe = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE") & "MSACCESS.EXE"
     
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    'Vérifie la présence du fichier
    If oFSO.FileExists(strAccessExe) Then
      'Access existe
    Else
      'Access n'est pas installé
    End If
    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  8. #8
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Bon sang... mais c'est bien sûr !
    Suis-je bête Hahaha
    Merci de votre patience !
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  9. #9
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Voilà... il me semble que c'est ok !
    J'ai testé le code suivant sur mon PC, sur VirtualBox avec et sans Runtime et il me semble que cela fonctionne:
    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
    Option explicit
     
    Dim ObjShell
    Dim WshShell
    Dim strAccessExe
    Dim byVersion
    Dim strVersion
    dim ValeurCle
    Dim Chemin
    Dim I
     
     
        Set ObjShell = CreateObject("Wscript.Shell")
        Set WshShell = WScript.CreateObject("WScript.Shell")
        Chemin = Left(WScript.ScriptFullName, InStr(WScript.ScriptFullName, WScript.ScriptName)-1)
        strAccessExe = ""
     
    'Lecture de la clé (Recherche Access désespérément !!)
        On Error Resume Next
        strAccessExe = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE\Path")
        On Error Goto 0
     
        If strAccessExe <> "" Then        ' La clé existe, on teste la version d'Access
     
            For I = 16 to 22            ' Exploration des versions compatibles (...)
                ValeurCle = InStr(1, strAccessExe, "Office" & I)
                if ValeurCle > 0 then Exit For
            Next
     
            If ValeurCle = 0 then        ' La version d'Acces n'est pas compatible, il faut installer le runtime
                WshShell.Run Chemin & "Rnt\Setup.exe"
            Else                        ' Une bonne version d'Access est installée, pas besoin du Runtime
                WshShell.Run Chemin & "Acc\Setup.exe"
            End If    
        Else                            ' La clé n'existe pas, on regarde si le Runtime est installé
            On Error Resume Next
            strAccessExe = objShell.RegRead("HKLM\SOFTWARE\Microsoft\Office\16.0\Access\InstallRoot\Path")
            On Error Goto 0
     
            If strAccessExe <> "" Then    ' Le runtime est installé, on installe sans lui
                WshShell.Run Chemin & "Acc\Setup.exe"
            Else                        ' Le Runtime n'est pas installé ben... on joue le grand jeu !
                WshShell.Run Chemin & "Rnt\Setup.exe"
            End If
        End If
     
     
    Set objShell = Nothing
    Dans ce code:
    • Je contrôle en premier si Access est installé, et si la version installée est compatible et j'installe soit l'application seule, soit accompagnée du Runtime
    • Si Access n'est pas présent, je teste si le Runtime est installé et j'installe la version de package adaptée.


    Je ne sais pas si ce code va intéresser qqu'un mais, si jamais... ben qu'il ou elle se serve :-)
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/08/2010, 17h40
  2. Réponses: 2
    Dernier message: 05/03/2010, 14h15
  3. [OL-2002] Listes de distribution dans une liste de distribution
    Par pc75 dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 11/01/2010, 13h07
  4. Réponses: 1
    Dernier message: 08/01/2010, 13h46
  5. Réponses: 1
    Dernier message: 11/02/2009, 06h33

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