myprocess.HasExited klappt nicht

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    myprocess.HasExited klappt nicht

    Hallo an Alle

    ich öffne mit meinem Programm den Explorer mit Pfadangabe und Dateimerkierung.
    Um nicht zuviele geöffnete Explorer zu haben möchte ich die letze erst geschlossen haben
    bevor ich einen neuen öffen kann.
    Das heisst mein Programm wird solange gestoppt bis der Explorer geschlossen ist.
    Ich habe gegoogelt, gelesen und probiert, ich weiss nicht weiter
    Mein letzer Code

    VB.NET-Quellcode

    1. Private Sub btnExplorer_Click(sender As Object, e As EventArgs) Handles btnExplorer.Click
    2. If ListBox2.Text = "" Then Exit Sub
    3. If alttext = ListBox2.Text Then Exit Sub
    4. alttext = ListBox2.Text
    5. Dim myprocess As New Process
    6. myprocess = Process.Start("explorer", "/e,/select," & ListBox2.Text)
    7. Do
    8. If Not myprocess.HasExited Then
    9. 'was auch immer
    10. Stop
    11. End If
    12. Loop While Not myprocess.WaitForExit(1000)
    13. Label2.Text = CStr(myprocess.ExitCode)
    14. Stop
    15. End Sub


    Vielleicht hat jemand eine Idee wie ich das Problem lösen kann.

    Ciao Rudi
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    ruediger2301 schrieb:

    Beispiel hab ich auch schon probiert
    Und, hat es funktioniert?
    Bei mir tut es das, bei @mrMo gewiss auch. ;)
    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!
    Hallo RodFromGermany
    meine Antwort war etwas voreilig.
    Ich jetzt das Beispiel von C# nach vb.net online konvertieren lassen.
    Diesen Code verstehe ich überhaupt nicht und ich weiss auch nicht wie ich den an meine Bedürfnisse anpassen kann.

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Diagnostics
    3. Imports System.Threading.Tasks
    4. Class PrintProcessClass
    5. Private myProcess As Process
    6. Private eventHandled As TaskCompletionSource(Of Boolean)
    7. Public Async Function PrintDoc(ByVal fileName As String) As Task
    8. eventHandled = New TaskCompletionSource(Of Boolean)()
    9. Using CSharpImpl.__Assign(myProcess, New Process())
    10. Try
    11. myProcess.StartInfo.FileName = fileName
    12. myProcess.StartInfo.Verb = "Print"
    13. myProcess.StartInfo.CreateNoWindow = True
    14. myProcess.EnableRaisingEvents = True
    15. AddHandler myProcess.Exited, New EventHandler(AddressOf myProcess_Exited)
    16. myProcess.Start()
    17. Catch ex As Exception
    18. Console.WriteLine($"An error occurred trying to print \"{fileName}\":\n{ex.Message}")
    19. Return
    20. End Try
    21. Await Task.WhenAny(eventHandled.Task, Task.Delay(30000))
    22. End Using
    23. End Function
    24. Private Sub myProcess_Exited(ByVal sender As Object, ByVal e As System.EventArgs)
    25. Console.WriteLine($"Exit time : {myProcess.ExitTime}\n" & $"Exit code : {myProcess.ExitCode}\n" & $"Elapsed time : {Math.Round((myProcess.ExitTime - myProcess.StartTime).TotalMilliseconds)}")
    26. eventHandled.TrySetResult(True)
    27. End Sub
    28. Public Shared Async Function Main(ByVal args As String()) As Task
    29. If args.Length <= 0 Then
    30. Console.WriteLine("Enter a file name.")
    31. Return
    32. End If
    33. Dim myPrintProcess As PrintProcessClass = New PrintProcessClass()
    34. Await myPrintProcess.PrintDoc(args(0))
    35. End Function
    36. Private Class CSharpImpl
    37. <Obsolete("Please refactor calling code to use normal Visual Basic assignment")>
    38. Shared Function __Assign(Of T)(ByRef target As T, value As T) As T
    39. target = value
    40. Return value
    41. End Function
    42. End Class
    43. End Class


    Probeweise den Code in ein Form1 eingefügt.
    Ergibt 27 Fehlemeldungen.
    Ich weiss nicht mehr weiter
    Gruß Rudi
    @ruediger2301 Mit welchem Studio und welchem Framework arbeitest Du?
    Poste mal einen Screenshot aller Fehlermeldungen.
    Erweiterte Antwort => Dateianhänge => Hochladen
    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!
    Hallo RodFromGermany

    ich benutze vb 2010 Express

    ich kann aber auch auf 2012 ausweichen

    Ich habe den Code in 2012 eingefügt.
    Nur 2 Warnungen
    Und einen Fehler


    VB.NET-Quellcode

    1. Warnung 1 "Public Shared Function __Assign(Of T)(ByRef target As T, value As T) As T" ist veraltet: "Please refactor calling code to use normal Visual Basic assignment". F:\Eigene Dateien Win 7\VisualStudio 2012\Projects\WindowsApplication2\WindowsApplication2\Form1.vb 15 19 WindowsApplication2
    2. Warnung 2 "Public Shared Function __Assign(Of T)(ByRef target As T, value As T) As T" ist veraltet: "Please refactor calling code to use normal Visual Basic assignment". F:\Eigene Dateien Win 7\VisualStudio 2012\Projects\WindowsApplication2\WindowsApplication2\Form1.vb 15 19 WindowsApplication2
    3. Fehler 3 Komma, ")" oder eine gültige Ausdrucksfortsetzung erwartet. F:\Eigene Dateien Win 7\VisualStudio 2012\Projects\WindowsApplication2\WindowsApplication2\Form1.vb 25 83 WindowsApplication2


    Dateien
    • Fehler.txt

      (4,9 kB, 45 mal heruntergeladen, zuletzt: )

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

    ruediger2301 schrieb:

    Ich habe den Code in 2012 eingefügt.
    Genau das meinte ich.
    Zum Fehler musst Du mal den Code posten.
    Schalt mal das Studio 12 auf Option Strict On um:
    Visual Studio - Empfohlene Einstellungen
    Studio 10 Express schmeiß raus.
    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!
    Hallo

    Option Strict ist On

    VB.NET-Quellcode

    1. Console.WriteLine("An error occurred trying to print \"{fileName}\":\n{ex.Message}")

    Angabe von Zeile, Spalte zeigt auf vor diesem Ausdruck {fileName}
    Fehler 3 Komma, ")" oder eine gültige Ausdrucksfortsetzung erwartet. F:\Eigene Dateien Win 7\VisualStudio 2012\Projects\WindowsApplication2\WindowsApplication2\Form1.vb 25 72 WindowsApplication2
    @ruediger2301 In Deinem Post #5 steht die Lösung. ;)
    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!
    @RodFromGermany

    Ich verstehe das nicht.
    Ich bekomme die Fehlermeldung Zeile 23 und 32 "Ungültiges Zeichen".
    Das sind 4 Dollarzeichen.
    Entferne ich die 4 Zeichen bekomme ich die Fehlermeldung wie in Post #9 beschrieben.

    Console.WriteLine($"An error occurred trying to print \"{fileName}\":\n{ex.Message}")

    ist verkehrt

    VB.NET-Quellcode

    1. Console.WriteLine("An error occurred trying to print \{fileName}\:\n{ex.Message}")

    ist richtig


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

    @ruediger2301 Sieh Dir mal das erste Zeichen nach ( an.
    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!
    @ruediger2301 Probiere mal dieses einfache Projekt, es läuft:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents prc As Process
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. prc = New Process
    5. prc.StartInfo.FileName = "notepad.exe"
    6. prc.EnableRaisingEvents = True
    7. prc.Start()
    8. End Sub
    9. Private Sub prc_exit(sender As Object, e As EventArgs) Handles prc.Exited
    10. MessageBox.Show("Prozess beendet")
    11. End Sub
    12. 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!
    Die Lösung klappt hier eh nicht? Der Explorer ist doch eine ​Single Instance Applications, egal wie viele Fenster du öffnest, es gibt nur einen "explorer.exe" Prozess. Der beendet sich nicht, sonst wäre auch der Desktop weg, denn da steckt dieser mit drin. Du müsstest irgendwie an das neu geöffnete Fenster-Handle kommen und könntest dann mit der API BOOL IsWindow(HWND hWnd); schauen, ob das Fenster noch gültig ist. Oder verstehe ich das hier völlig falsch?
    Im Zweifel selbst nen Explorer programmieren...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Bluespide
    das stellt mich wieder vor neue probleme
    Null Ahnung von sowas
    Danke für die Antwort
    @mrMo
    Das ist schon wieder eine neue Herausforderung
    Nach dem Motto 1. Problem nicht erledigt 2. anfangen
    Gibt es irgendwo einen Anschub als Grundgerüst um das weiter auszubauen?
    Bin für Ratschläge immer offen.



    Rudi

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

    Mein Ratschlag wäre es, die Grundlagen der Softwareentwicklung zu lernen. Wie man einen Explorer programmiert findest du evtl. hier im Forum. Ich für meinen Teil finde es zu umfangreich um es in diesem Thread zu besprechen...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    ruediger2301 schrieb:

    Klappt nur nicht mit dem Explorer.
    Ja, das ist leider so.
    Ich hab ein wenig mit prc.WaitForInputIdle() experimentiert, bei mir kommt die MessageBox 250 Millisekunden nach Start.
    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!