1. Programminstanz soll Startparameter von 2. erhalten, ohne eine 2. Instanz zuzulassen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von wisaa.

    1. Programminstanz soll Startparameter von 2. erhalten, ohne eine 2. Instanz zuzulassen

    ausgelagert aus Doppeltes öffnen von Programm verhindern ~VaporiZed

    Hallo Zusammen 8-) ,

    der Thread ist zwar etwas älter jedoch bin ich aktuell bei der selben Aufgabestellung am hadern.
    Ganz simpel: Mein programm Kann ich mittels Startparameter öffnen, dies funktioniert wunderbar jedoch würde ich genauso gern das öffnen einer zweiten Instanz unterdrücken und den Startparameter in die erste Instanz übergeben.

    Beispiel: Programm wird mit einem Pfad geöffnet, jedoch wird die zweite instanz nicht geöffnet sondern der pfad wird in eine Listbox Kopiert. ?(

    Würd mich freuen wenn mir Jemand bei dieser Aufgabe helfen kann. :whistling:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Willkommen im Forum.

    Steht doch größtenteils im Originalthread. »Einzelinstanzanwendung erstellen« aktivieren und dann bei den Anwendungsereignissen das Ereignis StartupNextInstance verarbeiten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    So ich habe nun ein weiteres Problem... und zwar lässt sich über das Ereignis keine Neue Form Öffnen.

    Ich versuche wenn das event ausgelöst wurde die Datei "Weiterzureichen".
    Dies mache ich wie folgt:
    In Application Events:

    VB.NET-Quellcode

    1. Private Sub MyApplication_StartupNextInstance(
    2. sender As Object,
    3. e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
    4. Dim inputArgument As String = ""
    5. Dim inputName As String = ""
    6. For Each s As String In e.CommandLine
    7. If s.ToLower.StartsWith(inputArgument) Then
    8. inputName = s.Remove(0, inputArgument.Length)
    9. End If
    10. Next
    11. If inputName = "" Then
    12. Else
    13. Form1.importfile(inputName)
    14. End If
    15. End Sub

    -> Im Form1.vb kommt dazu eine Abfrage die dann weiterleitet:

    VB.NET-Quellcode

    1. Sub importfile(filename As String)
    2. Select Case MessageBox.Show("Neuen Antrag erstellen?", "Dateiübergabe", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
    3. Case Windows.Forms.DialogResult.Yes
    4. openrequest(newid, True, filename)
    5. Case Windows.Forms.DialogResult.No
    6. Case Windows.Forms.DialogResult.Abort
    7. Return
    8. End Select
    9. End Sub
    ->

    VB.NET-Quellcode

    1. Sub openrequest(id As String, u As Boolean, Optional file As String = "null")
    2. Dim rfrm As New Form2
    3. rfrm.id = id
    4. If u = True Then
    5. rfrm.sendfile = True
    6. rfrm.newfile = file
    7. End If
    8. rfrm.ShowDialog()
    9. End Sub


    Wenn ich die 2 Form aus der Form1 öffne (zb. per buttom mit importfile(blabla...)) klappt alles prima, jedoch durch das Event ausgelöst bekomme ich den Fehler:
    System.Threading.ThreadStateException: "Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist."

    Ich werde aktuell nicht ganz schlau wo da der Fehler ist. Ich vermute durch das Event ausgelost verhaltet sich das ganze etwas anders als über die Form aber komme auf keine lösung. ?( ?( Villcht hat hier jemand nen tipp in welche richtung es hier weitergehen muss.
    Vielen Dank jedenfalls mal Vorab :thumbup:

    Neu

    Ich kapier grad den ersten Codeblock nicht.
    Kannst Du den bitte mal kurz erläutern - mit Augenmerk auf den Wert von inputArgument. Es startet mit "" und wird nie geändert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    Sorry so ists natürlich besser:

    VB.NET-Quellcode

    1. Private Sub MyApplication_StartupNextInstance(sender As Object, e
    2. As
    3. Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs)
    4. Handles Me.StartupNextInstance
    5. For Each s As String In e.CommandLine
    6. Form1.importfile(s)
    7. Next
    8. End Sub

    Ist noch sehr zusammengeschnipselt Tut mir leid. X/
    Aber das problem bleibt nach wie vor ;(

    Neu

    Der Fehler klingt nach einem Threading-Problem. Probierma

    VB.NET-Quellcode

    1. Private Sub MyApplication_StartupNextInstance(sender As Object, e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
    2. Dim frm = DirectCast(OpenForms(0), Form1)
    3. frm.BeginInvoke(Sub()
    4. For Each s As String In e.CommandLine
    5. frm.importfile(s)
    6. Next
    7. End Sub)
    8. End Sub
    Wenn das klappt gibts noch einiges zu sagen, zu dem, was bei dir falsch gelaufen ist.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Neu

    Also ich versuche einen Dateipfad mit dem Das Programm gestartet wird in die Form2.listview einzutragen.
    Dies versuche ich indem ich das Argument mit dem das Programm gestartet wird weiterreiche.
    beginnend mit
    von ApplicationEvents:
    importfile(s)-> weiter zu form1
    von der form1-> openrequest(newid, True, filename) -> zu form2

    VB.NET-Quellcode

    1. Sub openrequest(id As String, u As Boolean, Optional file As String = "null")
    2. Dim rfrm As New Form2
    3. rfrm.id = id
    4. If u = True Then
    5. rfrm.sendfile = True
    6. rfrm.newfile = file
    7. End If
    8. rfrm.ShowDialog()
    9. End Sub

    Hoffe es ist irgendwie verständlich was ich meine :|
    Ja der weg hat Funktioniert. Jetzt funktoniert es :thumbup:
    Aber wieso stellt sich mir jetzt noch die frage ?(

    Neu

    wisaa schrieb:

    Form1.importfile(inputName)
    Das ist das Problem.
    Form1 ist ein Datentyp, und du verwendest ihn, als wäre es ein Form-Objekt. Es ist aber ein Form-Datentyp.
    So erstellt man ein Form-Objekt:

    VB.NET-Quellcode

    1. dim frm = New Form1
    Siehst du? links ist ein Objekt, und rechts ist der Datentyp. Das Objekt frm wird mit dem Schlüsselwort New gebaut - und hat dann den Datentyp Form1.
    So ein Form1-Objekt kannst du vernünftig anzeigen, auch in Threading-Szenarien.
    Da gibts auch Tutss zu im WinForms-Tut-Bereicch des Forums - musste mal gucken - meine Link-Sammlung ist verlorengeganen. "Instanzieren von Dialogen" oder so hiess eines.

    Neu

    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!