Software über Commandozeilenparameter mehrmals starten, jedoch nicht zweimal wenn der Parameter gleich ist

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Software über Commandozeilenparameter mehrmals starten, jedoch nicht zweimal wenn der Parameter gleich ist

    Hallo Leute,

    der Titel ist etwas unglücklich gewählt, daher möchte ich das hier etwas näher ausführen.

    Meine Anwendung besteht aus verschiedenen Modulen. 90% des Codes der einzelnen Module sind identisch - nur die Bildschirmausgaben und spezifischen Funktionen sind unterschiedlich.

    Praktisch ist das so:
    * Es gibt eine Hauptsoftware (die Kassensoftware)
    * Zusätzlich gibt es ein Ferndisplay (Anzeige aller gebuchten Artikel z.B. in der Küche oder an einem Zubereitungsplatz)
    * Zusätzlich gibt es ein Modul, welches ausschließlich für die Kommunikation mit mobilen Endgeräten zuständig ist.

    Beispielsweise kann es in allen drei Modulen notwendig sein eine Kundenrechnung ausdrucken zu können (als Beispiel).
    Ändert man an einem Modul etwas im Programmcode, dann müsste man die anderen Module ebenfalls manuell ändern.

    Um mir das zu ersparen starte ich einfach die Hauptanwendung ohne Parameter und die beiden anderen mit Command-Line Parametern, welche ich über die Verknüpfungen übergebe z.B. Programmname.exe /Sync oder Programmname.exe /Ferndisplay.

    Das Programm liest diese Command-Line Parameter aus und und tut das an was für dieses Modul relevant ist.

    Es kann durchaus vorkommen, dass auf einem Rechner alle drei Module gleichzeitig laufen, es soll aber nicht sein, dass eines davon 2x läuft.
    Was für Lösungsansätze würdet Ihr vorschlagen um zu verhindern dass eines dieser Module mehrmals gestarten werden kann?

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 Ja, das geht. Starte die Applikation ohne das ApplicationFramework über die Sub Main().
    Program.vb

    VB.NET-Quellcode

    1. Public Class Program
    2. <STAThread()> _
    3. Public Shared Sub Main(ByVal commandLineArgs As String())
    4. ' Kommandozeile auswerten
    5. ' mit den anderen Kommandozeilen vergleichen
    6. If Not EXISTS Then
    7. Application.Run(New Form1)
    8. ' neue Zeile anhängen
    9. End If
    10. End Sub
    11. End Class
    Die Parameter der einzelnen Aufrufe musst Du in einer (gemeinsamen) Datei zwischenspeichern und bei jedem Start auslesen und ggf. erweitern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Anwendungsframework habe ich deaktiviert (sonst würde ein Doppelstart der .exe Datei nicht möglich sein).

    Irgendwie habe ich Deinen Lösungsansatz mit der Gemeinsamen Datei nicht ganz verstanden.

    Nach dem Start weis ich ja schon mal durch folgende Abfrage ob die Software mit CommandLineArgs (mit welchem) und ob ohne gestartet wurde:

    VB.NET-Quellcode

    1. For Each s As String In My.Application.CommandLineArgs
    2. If InStr(s, "erndisplay") <> 0 Or InStr(s, "Fern") <> 0 Then
    3. Ferndisplaymode = True
    4. ElseIf InStr(s, "pda") <> 0 Or InStr(s, "sync") <> 0 Or InStr(s, "PDA") <> 0 Then
    5. PDASync = True
    6. End If
    7. Next


    Nun müsste ich irgendwie herausfinden ob das aktuelle Modul u.U. nicht zweimal gestartet wurde und entsprechend das Programm beenden.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    Gemeinsamen Datei
    Es wird immer eine neue Instanz Deines Programms gestartet, jede neue Instanz weiß nix von den Kommandozeilenparametern der letzten, die musst Du in der alten Instanz speichern (anhängen) und in der neuen Instanz auslesen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich versteh immer noch Bahnhof ;) . Du meinst in die Datei trägt sich das Modul ein und beim Beenden wieder aus? Was ist bei einem vorzeitigen Programmabbruch, dann wirds nicht mehr aus der Liste ausgetragen. Sofern ich Deinen Ansatz richtig verstanden habe.

    Könnte man nicht auch irgend ein Fenster mit bestimmten Titel pro Modul erstellen und dann in der "Auflistung" aller Fenster nach einer bestimmten Zeichenfolge suchen. Ist das Fenster (mit z.B. "SYNC") in der Auflistung vorhanden, dann läuft das entsprechende Modul und die neue Instanz dieses Moduls beendet sich automatisch wieder.

    Wie kann ich mir alle Fenstertitel (auch von fremden Anwendungen) auflisten lassen?

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    alle Fenstertitel
    So:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. For Each pr In Process.GetProcesses
    3. If pr.MainWindowHandle <> Nothing Then
    4. Me.ListView1.Items.Add(pr.MainWindowTitle)
    5. End If
    6. Next
    7. End Sub
    Das mit dem Main mach ich mal fix.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke Rod, wenn das so einfach geht, dann passt das schon, brauchst nichts extra proggen.
    Dann mach ich das mit den Fenstertitel - ist für mich am einfachsten. Denn ein Hauptfenster ist ohnehin immer in einer Anwendung offen.
    Zur Not mache ich einfach ein unsichtbares 1x1 Pixel Fenster außerhalb des sichtbaren Bildschirmbereiches wo es nicht stört.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    extra proggen
    Ich wollte es mal wissen:

    VB.NET-Quellcode

    1. Public Class Program
    2. <STAThread()> _
    3. Public Shared Sub Main(ByVal commandLineArgs As String())
    4. Dim path = "c:\Temp\Args.txt"
    5. Dim first = True
    6. Dim ll = New List(Of String)
    7. If IO.File.Exists(path) Then
    8. ll.AddRange(IO.File.ReadAllLines(path))
    9. first = False
    10. End If
    11. Dim arg As String = ""
    12. If commandLineArgs.Length > 0 Then
    13. arg = commandLineArgs(0)
    14. End If
    15. If first OrElse Not ll.Contains(arg) Then
    16. ' neues Argument hinzufügen
    17. ll.Add(arg)
    18. IO.File.WriteAllLines(path, ll.ToArray)
    19. Application.Run(New Form1)
    20. ' aktuelle Liste einlesen (falls andere Instanzen inzwischen geschlossen wurden)
    21. ll.Clear()
    22. ll.AddRange(IO.File.ReadAllLines(path))
    23. ' Me löschen
    24. ll.Remove(arg)
    25. IO.File.WriteAllLines(path, ll.ToArray)
    26. End If
    27. End Sub
    28. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Aber wie schon geschrieben ist die Datei-Liste fürn Hugo wenn mal die Software unkontrolliert aussteigt oder jemand den Stecker zieht. ;)
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at