2017-06-08 7 views
1

je les sous:VB6: ShellExecute un fichier EXE dans AppData

Public Sub ShellApp(URL As String) 

     Dim vResult As Long 
     vResult = ShellExecute(0, "open", URL, vbNullString, vbNullString, vbMinimizedFocus) 

    End If 
End Sub 

C'est sur une couche qui ne peut pas être changé en raison de plusieurs fonctionnalités nécessaires sur ce sous. Maintenant, sur notre sous-main Main() par exemple, nous vérifions une liste des plugins ajoutés dans un fichier texte à côté de l'EXE, et appelons la boucle Sub in pour le chemin des plugins pour les exécuter. Donc, si j'ai 3 plug-ins comme ci-dessous dans le fichier texte:

C: \ App1.EXE

C: \ App2.EXE

C: \ Users \ AhmadMusa \ AppData \ Roaming \ App3. exe

Les deux premières applications fonctionneront bien sur tous les PC (chemin statique), mais la troisième application ne fonctionnera sur aucun PC sauf le mien qui n'est pas correct ... Notez que App3 est toujours installé sur AppData sur n'importe quel PC, pour y accéder dynamiquement pour exécuter l'application à partir de n'importe quel PC sans ajustements sur le sous-marin.

Quel sera le chemin placé dans le fichier texte pour la troisième application afin qu'il puisse fonctionner sur tous les PC?

J'ai essayé (AppData \ Roaming \ App3.exe) mais cela ne fonctionne pas ... J'ai trouvé sur un thread (http://www.vbforums.com/showthread.php?529776-RESOLVED-Open-a-folder-in-AppData) que je peux appeler quelque chose comme (shell: AppData \ Roaming \ App3.exe) il a fait ne fonctionne pas pour exécuter le App3.exe, mais si j'appelle (shell: AppData \ Roaming), il ouvrira très bien le dossier Roaming. Mais ne peut pas exécuter le fichier EXE.

Des idées?

Merci.

+0

Eh bien, encore il semble ne suis pas faire mon auto clair. Je sais comment obtenir le chemin AppData en utilisant le code, je ne suis pas en cours d'exécution des applications via les données de l'application tout le temps. J'ai une fonction qui prend argument le chemin que je veux exécuter, et puis je shell exécute ce chemin pris à partir de l'argument. Cet argument est personnalisé ce qui signifie qu'il peut être changé en tout ce que vous pouvez imaginer (défini par l'utilisateur) peut être c: \ app.exe peut être d: \ app.exe ou quoi que ce soit d'autre..Maintenant, que dois-je envoyer à cet argument exécuter l'application placée dans AppData "à l'exécution" Je vais envoyer cet argument à l'exécution (de notre fichier tampons où nous sauvegardons le chemin de l'application) sur notre première exécution –

+0

Si je vous comprends, l'utilisateur peut déplacer votre application n'importe où sur leur système et vous souhaitez conserver la possibilité de démarrer l'application via votre interface. Si cela est correct, à moins qu'ils déplacent votre application vers un emplacement quelconque sur le chemin du système, vous aurez besoin d'un moyen de stocker le chemin du nouvel emplacement. – jac

+0

@jac J'ai une application installée n'importe où qui contient la possibilité d'exécuter une application tierce depuis l'intérieur, donc nous avons un onglet où nous plaçons tous les plugins tiers. Ces plugins parfois sur c lecteur, lecteur d ou n'importe où. Supposons maintenant que j'ai une application installée sur le dossier de données de l'application, comment puis-je l'appeler à partir de notre application? Que dois-je mettre sur le chemin? Une recherche Google guidée pour mettre le chemin comme ("shell: AppData \ some folder \") et cela a fonctionné pour ouvrir l'explorateur sur cet endroit, mais pas en cours d'exécution de l'exe. –

Répondre

0

Je crois qu'il n'y a aucun moyen de résoudre le problème sans modifier la procédure d'origine "ShellApp".

dans le cas où vous changez d'avis, je pense que ce poste peut venir dans l'aide (avec quelques tweekings)

Public Sub ShellApp(URL As String) 

     Dim vResult As Long 
     'vResult = ShellExecute(0, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus) 
     vResult = ShellExecute(0, vbNullString, "cmd.exe", "/k """"" & URL & """""", vbNullString, vbNormalFocus) 

End Sub 

Private Sub Command1_Click() 
    ShellApp "%appdata%\PROGRAME.exe" 

End Sub 

parce que « cmd.exe » et ofcourse scripts de traitement par lots sont capables de dépenser des variables qui sont avec pour cent caractère enfermé « % »

pour fermer la console dès qu'il commence à changer le paramètre «/k » à «/c »,

+0

Merci pour la réponse. Je vais voir si je peux utiliser votre code ci-dessus pour l'envoyer comme URL initialement pour lancer cmd avec le chemin exe, sans la mise à jour sur la fonction.Parce que la mise à jour de la fonction nécessite un correctif, et ce correctif doit être empaqueté pour plus de 500 sociétés différentes :) ce que j'essaie d'éviter depuis le début. Merci quand même. –

0

Vous devez étendre la variable d'environnement (ce qui est ce que le %...% fait):

Debug.Print Environ("APPDATA") ' will print the expanded %appdata% 

Ainsi, dans votre fichier texte que vous devez mettre:

% APPDATA% \ App3.exe

Comment développer le chemin? Vous pouvez faire une boucle sur les variables d'environnement fournies par la fonction VB Environ et faire une chaîne de remplacement par vous-même (la façon VB) ou vous pouvez profiter de la fonction ExpandEnvironmentStrings (la manière de l'API Win32).

Ci-dessous un extrait en utilisant cette seconde option:

Private Declare Function ExpandEnvironmentStrings Lib "kernel32.dll" _ 
       Alias "ExpandEnvironmentStringsA" (_ 
       ByVal lpSrc As String, _ 
       ByVal lpDst As String, _ 
       ByVal nSize As Long) As Long 

Public Function ExpandEnvironString(ByVal URL As String) As String 
    Dim buf As String, bufSize As Long 
    bufSize = ExpandEnvironmentStrings(URL, ByVal 0&, 0&) 
    buf = String(bufSize + 1, vbNullChar) 
    bufSize = ExpandEnvironmentStrings(URL, buf, Len(buf)) 
    ExpandEnvironString = Left$(buf, InStr(1, buf, vbNullChar) - 1) 
End Function 

Avant d'appeler ShellApp(URL As String) vous devez étendre le chemin:

URL = ExpandEnvironString(URL) 

ShellExecute recevront le chemin élargi: C:\Users\AhmadMusa\AppData\Roaming\App3.exe

C'est un changement sans rupture, parce que si votre paramètre par défaut initial sera plus tard changé en un chemin fixe personnalisé, t La fonction ExpandEnvironmentStrings va simplement l'ignorer.

Exemple:

ExpandEnvironString ("C: \ App1.EXE") retournera C: \ App1.EXE

Plus d'infos:

vous pouvez obtenir tous vos variables d'environnement avec la procédure suivante:

Private Sub EnvironmentEntries() 
    Dim Entry As String, i As Long 
    i = 1 
    Do 
     Entry = Environ(i) 
     i = i + 1 
     If Entry = "" Then Exit Do 
     Debug.Print Entry 
    Loop 
End Sub 

... et vérifier quelques informations supplémentaires ici:

Why are there directories called Local, LocalLow, and Roaming under \Users\?

+0

Je ne veux pas obtenir le chemin AppData par code (je sais déjà comment). Je veux savoir quel est le bon chemin à envoyer à la fonction ShellExecute exécuter un fichier exécutable qui est placé dans AppData. Mais pas dans le code. L'idée est, comme mentionné ci-dessus, nous avons la fonction à ShellExecute tout client veut, et par défaut nous voulons exécuter une application placée dans AppData, mais le client peut le changer plus tard pour être C: \ App.exe, ou D : \ XXX \ App.exe –

+0

ajoutez votre commande avec "cmd/c" la partie "/ c" peut être facultative. –

0
sub test() 
    dim tmp as string 
    tmp = environ("AppData ") & "\calc.exe" 

    call ShellExecute(..., tmp, ...) 
end sub 

remplir les autres arguments (...) la façon dont vous voyez à droite