Shellexecute fichier existant non trouvé

Signaler
Messages postés
812
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
4 septembre 2020
-
Messages postés
812
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
4 septembre 2020
-
Bonjour,
Je vérifie qu'un fichier existe bien avant de l'exécuter
sFullPath = "E:\ReefTools\RVRTupgrade.exe"
Dim oFile As New Scripting.FileSystemObject
If oFile.FileExists(sFullPath) Then
lngReturn = ShellExecute(Me.hwnd, vbNullString, sFullPath, vbNullString, App.Path, SW_SHOWNORMAL)
je reçois lngReturn = 2 : file not found !
Quelle peut-être la raison de ce comportement bizarre ?

6 réponses

Messages postés
2225
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
5 septembre 2020
113
Bonjour
Si ton exécutable existe bien ici
If oFile.FileExists(sFullPath)
celui-ci nécessite peut-être un fichier en paramètre ou App.Path est incorrect à la ligne qui suit .

L'exécutable a l'air d'être un programme pour mettre à jour un fichier : celui-ci existe-t-il et est-il au bon emplacement ?

De plus pourquoi vbNullString ? Il faut ouvrir ton exécutable : "Open" serait plus approprié .


Messages postés
812
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
4 septembre 2020
2
Merci pour ta réponse,
sFullPath = App.Path & "\RVRTupgrade.exe".
Il s'agit en effet d'un utilitaire de mise à jour, il ne nécessite pas de paramètre.

Le but est de faire une mise à jour automatique : mon logiciel RVReefTools.exe va voir sur Internet sil y a une version plus récente, auquel cas, puisqu'il ne peut pas écraser l'exe qui tourne, il télécharge RVRTupgrade.exe, le lance puis s'arrête.
RVRTupgrade.exe télécharge la version plus récente de RVReefTools.exe, le démarre puis s'arrête.

J'utilise Shellexecute - Open pour ouvrir un fichier, par exemple une page Internet ou un pdf avec une application; ici je veux exécuter le fichier d'où vbNullString.

J'aurais du préciser que 99 fois sur 100 tout fonctionne parfaitement, mais pas chez certains utilisateurs, je ne comprends pas pourquoi.
Messages postés
179
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
4 septembre 2020
5
Salut Hervé,

sFullPath = "E:\ReefTools\RVRTupgrade.exe" 

Suppose que tous ont installés l'application de mise à jour en "E:".

Il est impossible de savoir si ce lecteur est présent.
De plus, le système attribue un nom de lecteur "libre" qui va dépendre de la configuration de l'utilisateur.

Dans tous les cas, il faut utiliser des paths relatifs ou tester plusieurs lecteurs (C,D,E ou F), si ton application se trouve sur un disque dur, sur un lecteur CD virtuel ou une carte USB.

Donc, la racine "App.path" donne un répertoire physique existant.
Dans le cas contraire, tu spécules sur la présence d'un programme qui n'existe seulement dans ta configuration personnelle.
Et utiliser un fichier executable externe est très risqué, si le fichier n'est pas diffusé avec le programme.

Version différente, configuration matérielle, anti-virus et préférences utilisateurs, seront là pour embrouiller les appels et les retours de fichiers.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
"open" je dirai ; même chose.

doit etre lié a un Windows recent (store toussa)
Messages postés
812
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
4 septembre 2020
2
Merci mais c'est fatalement le même répertoire.
"E:\ReefTools\RVRTupgrade.exe" est un exemple

Le programme s'appelle RVReefTools.exe et se trouve fatalement dans App.Path
il vérifie que RVRTupgrade.exe se trouve bien dans App.Path
si ok Shellexecute App.Path & "\RVRTupgrade.exe" donne la plupart du temps un code 0 = OK
mais de temps en temps un code 2 = not found : comment ce fait-ce ?
Messages postés
179
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
4 septembre 2020
5
Salut Hervé,

Non, le code 2 n'est pas nécessairement la non-présence du fichier cible.

Ce code indique une erreur d'ouverture de fichier, avec soit un niveau de d'accès insuffisant sous Windows, un blocage de l'antivirus (accès réseau non manuel), un canal réseau bloqué (firewall) ou tout bêtement un rapport d'échec de démarrage si le programme a déjà été lancé précédemment.

Imagine que l'utilisateur lance deux cessions de ton programme… la seconde ouverture lancera sa mise à jour alors qu'elle fonctionne déjà.

Il faut que tu lances ta mise à jour deux fois de suite, pour voir si deux tâches différentes sont possibles… si le programme est à cession unique, le code -2 sera affiché lors de sa deuxième execution.

Dans tous les cas, demande aux utilisateurs de modifier les préférences d'accès du fichier "exe" en le paramétrant en "Accès Administrateur" (à chaque lancement).

Si cela ne fonctionne pas, un répertoire "hors" répertoires protégés serai plus judicieux.
Il suffit d'installer ton programme en "c:\monprogramme" et non dans le "Program files" qui, comme Renfield l'a souligné, est redirigé vers des répertoires miroirs, car certaines applications sont parfois à la peine avec des répertoires exotiques, et ne redirigent pas les bons paths.

Sur W7, il te faut installer l'"exe" esclave en même temps, car si le fichier est déplacé, copier ou installé dans le répertoire "App.path", le fichier ne sera pas copier dans le bon répertoire… il peut même y avoir des doublons dans le même répertoire… celui d'origine et celui en miroir (option compatibilité).
Messages postés
812
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
4 septembre 2020
2
Merci pour les autres significations possibles du code 2.

Je suggère déjà aux utilisateur d'installer le programme dans un répertoire dédié.
Ceux qui l'installent par exemple dans C:\users... ou C:\Program files ... ou quand l'anti-virus ou le firewall sévit reçoivent un code 5 = The operating system denied access to the specified file.

Avant d'exécuter l'esclave l'exe principal le télécharge puis vérifie sa présence, l'esclave est donc à ce moment là fatalement dans le même répertoire.