Frage

Ich bin mit Wise Package Studio 7.0 SP2 unter Windows XP.

Ich habe eine MSI Wrapped EXE-Installation, die über glücklich, einige Dateien zu installieren geht und dann eine der Dateien aus der Installation ausgeführt wird, die wir als app.exe beziehen.

So auf die Schaltfläche „Ausführen Latente“ -Reiter des MSI-Editor, hatte ich die Zeilen hinzuzufügen:

If Not Installed then
  Execute Installed Program app.exe (Action)
End

Damit wird sichergestellt, dass mein app.exe würde laufen nur auf einer Anlage und nicht während einer Änderung / Reparatur / Entfernung. Wenn app.exe läuft, fügt bequem selbst in die Taskleiste.

Ich bin auf der Suche nach etwas, das das Gegenteil während einer Entfernung tun wird. Ich mag den app.exe Prozess stoppen damit es aus der Taskleiste zu entfernen.

Zur Zeit meine Entfernung wird von allen Dateien befreit jedoch die app.exe lief bleibt und nach wie vor in der Systemablage erscheint. Ich habe bei Hinzufügen der bedingten Anweisung sah:

If REMOVE~="ALL" then
  *remove the app from the systray!*
End

Die bedingte Anweisung wird mich nur auf eine Entfernung etwas tun lassen, aber ich bin der beste Ansatz nicht sicher, tatsächlich zu gehen, um den Prozess zu beenden. Gibt es einen MSI Befehl, den ich laufen kann, dass ich läßt das tun? Soll ich meine eigene .exe schreiben, die das tun?

War es hilfreich?

Lösung

Vor 6 Monaten wurden wir VBScript Aktionen mit der gleichen Sache zu tun, dann rechts um die Zeit war, dass SP3 die objProcess.Terminate () Funktion freigegeben nur auf einigen Maschinen arbeiten abgelehnt. Egal, was wir taten, es fror nur. Dies geschah auf rund 10% unserer Prüfmaschinen und so waren wir eine alternative Lösung zu finden gezwungen (wer weiß, wie viele Kunden es haben könnte eingefroren auf!)

Meine erste Entdeckung war die eingebaute (ab Windows 2000) Befehl TASKKILL zB:. TASKKILL /IM app.exe /F aber, dass ähnliche Mittel zu verwenden, der Tötung eines Prozesses scheint, als wir in VBScript verwendet, das Verfahren würde auch scheitern

So, jetzt sind wir mit dem pskill.exe Tool von Sysinternals, benötigen Sie eine Befehlszeilenoption verwenden, um die Lizenzvereinbarung prompt aber anders als das zu unterdrücken, es war der sicherste Weg, eine laufende EXE zu töten, die ich gefunden habe, .

Natürlich ist die beste Lösung wäre eine eigene EXE oder DLL zu erstellen, es zu tun sollten Sie ein wenig C wissen passieren ++;)

Andere Tipps

Just Prozesse enden nicht ausreichend ist, da die Windows-Infobereich nicht aufzuräumen (aber Windows wird ein Symbol ohne Anpassungsprozess bereinigen, wenn neben der Maus in schwebt). Noch ein Grund mehr, warum Apps endet abrupt im Allgemeinen am besten für das Debuggen reserviert ist. Leider ist eine richtige Lösung auch mehr beteiligt. Sie könnten ein benanntes Ereignis in der App erstellen und eine Callback-Methode registrieren aufgerufen werden, wenn es gesetzt ist. Der Rückruf würde die App schließen. Dann würden Sie eine benutzerdefinierte Aktion schreiben, die das Ereignis gesetzt und gewartet, bis Prozess beendet.

Wenn Sie Stornierung unterstützen (zB der Benutzer aufgefordert wird, dass er nicht gespeicherte Änderungen hat und beschließt, nicht abzubrechen), können Sie einen anderen Namen Ereignis verwenden, das, um anzuzeigen, so dass die benutzerdefinierte Aktion kann entweder für den Prozess warten zu beenden oder eine Stornierung Ereignis, je nachdem, was zuerst eintritt.

Sie können einfügen VBscript Elemente in das MSI als benutzerdefinierte Aktionen. So etwas sollte die Arbeit machen:

strMachine = "localhost"
strAppName = "notepad.exe"

Set objProcesses = GetObject("winmgmts://" & strMachine).ExecQuery("SELECT * FROM Win32_Process WHERE Caption LIKE '" & strAppName & "'")

For Each objProcess In objProcesses
    intRetVal = objProcess.Terminate(0)
Next

Wenn Ihr app.exe im Hause erstellt wurde, können Sie eine Befehlszeile hinzufügen, dass es den einen töten erzählt, die derzeit läuft. Wenn diese Befehlszeile gegeben, wäre es, dass die erste Instanz des Programms eine Nachricht oder etwas zu senden, dass es nur darauf wartet, zu beenden erzählt und dann hängen herum, bis die erste Instanz des Programms tatsächlich beendet hat. Der Installateur würde dann in der Lage sein, das Programm mit dem Kill-Schalter laufen und wissen, dass die ursprüngliche Instanz davon weg ist, wenn die Abtötung geschaltet Instanz zurückgegeben hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top