2017-06-08 11 views
1

Ich habe folgendes sub:VB6: ShellExecute eine EXE innerhalb AppData

Public Sub ShellApp(URL As String) 

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

    End If 
End Sub 

Dies ist auf einer Schicht, die nicht auf mehrere Funktionen auf diesem Unter Bedarf geändert werden kann.

Jetzt überprüfen wir zum Beispiel eine Liste der hinzugefügten Plugins, die in einer Textdatei neben der EXE gespeichert sind, und rufen das obige Sub in for loop mit dem Pfad der Plugins auf, um sie auszuführen. Also, wenn ich 3 Plugins wie unten in der Textdatei:

C: \ App1.exe

C: \ App2.exe

C: \ Benutzer \ AhmadMusa \ AppData \ Roaming \ Anw3. exe

Die ersten beiden Anwendungen laufen auf allen PCs einwandfrei (Statischer Pfad), aber die dritte App funktioniert auf keinem PC außer meinem, der nicht in Ordnung ist ... Beachten Sie, dass App3 immer auf jedem PC auf AppData installiert ist um dynamisch darauf zuzugreifen, um die App von jedem PC aus ohne Anpassungen auf dem Sub zu laufen.

Wie wird der Pfad in die Textdatei für die dritte App eingefügt, damit er auf allen PCs funktioniert?

Ich versuchte (AppData \ Roaming \ App3.exe), aber es funktioniert nicht ... Ich fand auf einem Thread (http://www.vbforums.com/showthread.php?529776-RESOLVED-Open-a-folder-in-AppData), dass ich etwas wie (shell: AppData \ Roaming \ App3.exe) es getan hat nicht funktionieren, um die App3.exe auszuführen, aber wenn ich (Shell: AppData \ Roaming) anrufe, wird es den Roaming-Ordner sehr gut öffnen. Aber kann die EXE nicht ausführen.

Irgendwelche Ideen?

Danke.

+0

Nun, noch scheint es ist nicht mein selbst klar zu machen. Ich weiß, wie ich den AppData-Pfad mithilfe von Code abrufen kann. Ich verwende Apps nicht ständig über App-Daten. Ich habe eine Funktion, die Argument den Pfad, den ich ausführen möchte, und dann Shell ausführen diesen Pfad aus Argument. Dieses Argument ist benutzerdefiniert, was bedeutet, dass es auf alles geändert werden kann, was Sie sich vorstellen können (benutzerdefiniert) c: \ app.exe kann d: \ app.exe oder irgendetwas anderes sein .. Nun, was soll ich an dieses Argument senden run app in AppData zur Laufzeit ausführen Ich werde dieses Argument zur Laufzeit senden (aus unserer Pufferdatei, in der wir den App-Pfad speichern) bei unserem ersten Lauf –

+0

Wenn ich Sie verstehe, kann der Benutzer Ihre Anwendung an jeden beliebigen Ort auf ihrem System verschieben und Sie möchten die Möglichkeit erhalten, die Anwendung über Ihre Schnittstelle zu starten. Wenn dies korrekt ist, müssen Sie, wenn Sie Ihre Anwendung nicht an einen Ort im Systempfad verschieben, eine Möglichkeit zum Speichern des Pfads des neuen Speicherorts verwenden. – jac

+0

@jac Ich habe eine Anwendung anyplace installiert, die die Möglichkeit enthält, jede Anwendung von Drittanbietern von innen zu laufen, so haben wir eine Registerkarte, wo wir alle Drittanbieter-Plugins platzieren. Solche Plugins sind manchmal auf Laufwerk, Laufwerk oder wo auch immer. Nun nehme ich an, ich habe eine App im App-Datenordner installiert, wie kann ich sie von unserer Anwendung aus aufrufen? Was soll ich auf den Weg legen? Eine Google-Suche führte den Pfad als ("shell: AppData \ some folder \") und das funktionierte, um den Explorer an diesem Ort zu öffnen, aber nicht die exe. –

Antwort

0

Ich glaube, dass es keine Möglichkeit gibt, Lösen Sie das Problem, ohne die ursprüngliche Prozedur "ShellApp" zu ändern.

, falls Sie Ihre Meinung ändern, ich glaube, dieser Beitrag in Hilfe kommen kann (mit einigen 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 

dies, weil nur „cmd.exe“ und natürlich Batch-Skripten können Variablen aufwenden, die mit Prozentzeichen „%“

um die Konsole so schnell zu schließen, wie es umschloss die Parameter beginnt ändern „/ k“ auf „/ c“,

+0

Danke für die Antwort. Ich werde sehen, ob ich Ihren obigen Code verwenden kann, um es als URL zu senden, um cmd mit Exe-Pfad zu starten, ohne die Update-Funktion.Weil das Aktualisieren der Funktion einen Patch benötigt, und dieser Patch soll für mehr als 500 verschiedene Firmen gepackt sein :) was ich seit Beginn zu vermeiden versuche. Danke trotzdem. –

0

Sie müssen die Umgebungsvariable erweitern (das ist, was die %...% tut):

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

in Ihrer Textdatei Also, sollten Sie setzen:

% APPDATA% \ App3.exe

Wie den Pfad zu erweitern? Sie können die Umgebungsvariablen, die von der VB Environ-Funktion bereitgestellt werden, durchlaufen und eine Zeichenfolge selbst ersetzen (VB-Methode), oder Sie können von der ExpandEnvironmentStrings-Funktion (der Win32-API-Methode) profitieren.

Unterhalb einer Schnipsel diese zweite 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 

Bevor Sie anrufen ShellApp(URL As String) Sie den Pfad erweitern sollte:

URL = ExpandEnvironString(URL) 

ShellExecute den erweiterten Pfad erhalten: C:\Users\AhmadMusa\AppData\Roaming\App3.exe

Dies ist eine nicht brechende Änderung, denn wenn Ihre anfängliche Standardeinstellung später in einen benutzerdefinierten festen Pfad geändert wird, t er ExpandEnvironmentStrings Funktion wird es einfach ignorieren.

Beispiel:

ExpandEnvironString ("C: \ App1.exe") wird C: \ zurück App1.exe

Weitere Informationen:

können Sie alle bekommen Ihre Umgebungsvariablen mit folgendem Verfahren:

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 

... und überprüfen Sie einige zusätzliche Informationen hier:

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

+0

Ich möchte nicht den AppData-Pfad nach Code abrufen (ich weiß bereits wie). Ich möchte wissen, was der richtige Pfad ist, um an ShellExecute-Funktion zu senden, führen Sie eine ausführbare Datei aus, die in AppData platziert wird. Aber nicht innerhalb des Codes. Die Idee ist, wie oben erwähnt, haben wir die Funktion zu ShellExecute allem Client wollen, und standardmäßig Setup möchten wir eine App in AppData platziert ausführen, aber Client kann später ändern, um C: \ App.exe oder D : \ XXX \ App.exe –

+0

fügen Sie Ihren Befehl mit "cmd/c" voran, der "/ c" -Teil - kann optional sein. –

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

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

die anderen Argumente füllen (...) so, wie Sie es sehen rechts

Verwandte Themen