Wie können Sie sicherstellen, dass eine ausführbare Datei über eine andere ausführbare Datei geöffnet wird?

8

Es gibt einen netten kleinen Trick, den Sie verwenden können, wenn das Betriebssystem niemals eine Sperre für die .dll s / .exe und für .exe ausführen soll.

Nehmen wir an, unser Verzeichnis sieht so aus:

%Vor%

Als ein grundlegendes Beispiel könnten wir dies tun:

%Vor%

Wir könnten dort auch mehr Logik einfügen, die wir verwenden könnten, um actualProgram.exe tatsächlich zu ersetzen / zu aktualisieren, obwohl eine Instanz des Prozesses geöffnet wurde. Probieren Sie es aus: Sie können Abhängigkeiten und das "aktuelle" Programm löschen / ändern / ersetzen, wenn es über den "Öffner" geladen wird. Offensichtlich hat dies seine Vorteile, nämlich Updates viel einfacher zu machen.

Aber wie können Sie in Ihrer "actual.exe" sicher sein, dass sie über eine andere ausführbare Datei geladen wurde und wissen, dass sie geladen wurde, ohne dass eine Sperre für .exe gesetzt wurde? Wenn jemand nur die "actual.exe" laden soll, d. H. Nicht über den "Öffner", möchte ich sicherstellen, dass der Prozess sofort beendet wird.

Hinweise?

    
Joseph Nields 19.08.2015, 13:13
quelle

2 Antworten

2
  1. Übergeben Sie einen Befehlszeilenparameter an actualProgram.exe , damit dieser weiß, dass er vom Launcher gestartet wurde. (Auch in einem Kommentar zum OP von oleksii vorgeschlagen)
  2. Legen Sie eine Umgebungsvariable im Startprogramm fest, die vom untergeordneten Prozess vererbt werden kann.
  3. Verwenden Sie eine der dokumentierten Methoden zum Abrufen der übergeordneten Prozess-ID und verwenden Sie diese, um Informationen über den Startprozess zu erhalten. (Wenn der Elternprozess beendet wird, kann Windows die PID natürlich einem neuen Prozess zuweisen.)
  4. Erstellen Sie eine Memory-Mapped-Datei / Named Pipe / etc. im Launcher, mit dem Informationen an das Kind weitergegeben werden können.
  5. Laden Sie die Bibliotheksreferenzen im untergeordneten Element manuell und entladen Sie sie. Wenn es sich um .Net-Assemblys handelt, können Sie das AssemblyResolve -Ereignis verwenden, indem Sie die Datei von der Festplatte in ein Bytearray laden und die Assembly.Load(byte[], byte[]) -Überladung verwenden.

Hinweis: Solange alle Ihre Assemblys manuell oder durch die Laufzeit geladen werden, bevor Sie sie ändern / verschieben / löschen, sind Sie wahrscheinlich in Ordnung. Auch das Ändern der DLL nach dem Laden wird wahrscheinlich keine Auswirkungen auf den laufenden Prozess haben. Ich sage wahrscheinlich in beiden Fällen, weil es im Allgemeinen eine gute Idee ist, die Bibliotheken zur Laufzeit allein zu lassen, besonders wenn Sie sie nicht manuell laden.

Siehe auch:

theB 19.08.2015 14:19
quelle
0

Wie wäre es mit dem Senden einer benutzerdefinierten Nachricht an die Anwendung, nachdem sie gestartet wurde? Der Code für start lautet etwa so:

%Vor%

und die Anwendung, die Sie ausführen verwenden, benötigen einen kurzen benutzerdefinierten Windows-Meldungshandler, um auf das "Stay-Alive" -Signal zu achten.

%Vor%

Wenn Sie sich nicht auf das Timing von Windows-Nachrichten verlassen möchten, können Sie Ihr Zielprogramm so einstellen, dass es gestartet wird, aber erst dann wirklich etwas tun, wenn es die benutzerdefinierte Nachricht empfängt.

    
JosephStyons 19.08.2015 17:18
quelle

Tags und Links