Problem um zu Testen, ob eine Anwendung (excel) gestartet ist

  • VB.NET

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

    Problem um zu Testen, ob eine Anwendung (excel) gestartet ist

    Moin!

    ich habe die Aufgabe zu prüfen, ob Excel gestartet ist und habe mir hierzu über das Netz folgendes Beispiel heruntergeladen:

    vbarchiv.net/tipps/tipp_1327-p…dung-gestartet-vbnet.html

    Wenn ich es ausführe, dann bekomme ich folgende Meldung:

    System.ComponentModel.Win32Exception (0x80004005): Zugriff verweigert
    bei System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
    bei System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId, Boolean firstModuleOnly)
    bei System.Diagnostics.NtProcessManager.GetFirstModuleInfo(Int32 processId)
    bei System.Diagnostics.Process.get_MainModule()
    bei EBL.Service.Miscellaneous.IsAppRunning(String sFilename, Boolean bCompareFullPath, eActionState nAction) in C:\VSProjects\2015\EBL.Service\EBL.Service\cls_Miscellaneous.vb:Zeile 1481.
    bei EBL.Verwaltung.InspCrawler.EBL_Insp_Crawler_Work(String Laufwerk, String Laufwerk4Log) in C:\VSProjects\2015\EBL.Verwaltung\EBL.Verwaltung\cls_EBL.Insp_Crawler.vb:Zeile 122.
    bei EBL.Verwaltung.InspCrawler.EBL_Insp_Crawler_K() in C:\VSProjects\2015\EBL.Verwaltung\EBL.Verwaltung\cls_EBL.Insp_Crawler.vb:Zeile 108.
    bei EBL.Verwaltung.Verwaltung_Cmd.EBL_Insp_Crawler_K() in C:\VSProjects\2015\EBL.Verwaltung\EBL.Verwaltung\cls_EBL.Verwaltung_Cmd.vb:Zeile 104.
    bei Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
    bei Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
    bei Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()


    Es geht hierbei um folgende Zeile:

    VB.NET-Quellcode

    1. sProcessFile = oProcess.MainModule.FileName.ToLower


    Kann mir einer weiterhelfen oder hat eine bessere Idee?

    Gruß Jan
    Hallo

    Da hier in einer Schleife alle Prozesse durchlaufen werden kann es sein das du auf die Eigenschaften von einem Process evtl. keinen Zugriff hast. Steht ja in der Ausgabe: Zugriff verweigert
    Evtl. mit Adminrechten probieren

    Setze einen Haltepunkt und schau dir an um welchen Prozess es hier geht. Wenn es so ist wie ich denke musst du eben eine Fehlerbehandlung einbauen um den Fall das du auf einen gewissen Prozess keinen Zugriff hast abzufangen.

    BTW:
    Finde den Code für das was DU benötigst allerdings sehr suboptimal. Wozu willst du überhaupt ALLE Prozesse durchlaufen?
    DIR geht es ja lediglich um Excel. Also warum verwendest du nicht Process.GetProcessesByName Methode?
    Viel weniger Code, schneller und du musst vermutlich keine Fehler abfangen.

    Weiters solltest du bedenken (weis nicht ob für dich wichtig) das es auch den Prozess gibt wenn z.b. noch ein anderer Benutzer angemeldet ist und dieser Excel offen hat.
    Du soltest also auch versuchen herauszufinden unter welchem Benutzercontext der Prozess läuft und nachsehen ob dieser der selbe ist wie der aktuelle. ;)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Moin!
    ich habe das soweit hinbekommen, das zumindest derzeit kein Fehler kommt.

    Mein Text läuft auf die Excel.exe.

    In der Taskliste ist Excel geschlossen - aber ich aber auch gemacht.

    Die Liste der Prozesse führt Excel aber weiterhin 2x! Darauf hin bekomme ich natürlich die Meldung, dass die App noch am laufen ist.

    Habe ich dann überhaupt den richtigen Weg eingeschlagen um zu prüfen, ob Excel noch aktiv ist????

    Gruß Jan

    jan99 schrieb:

    Habe ich dann überhaupt den richtigen Weg eingeschlagen
    Die Liste updatet sich nicht automatisch, Du müsstest sie nach jeder Aktion von Dir oder per Timer aktualisieren.
    Und das beginnt mit dem Löschen der aktuellen Liste, wie @Dksksm schrieb.
    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!

    VB.NET-Quellcode

    1. [vbnet]
    Hallo jan99,
    du kannst mit folgendem Code feststellen, ob Excel bereits gestartet ist oder nicht.
    Viel Spass
    '
    Option Explicit On
    Option Compare Text
    Option Strict Off

    Imports xlMa = Microsoft.Office.Interop.Excel
    Imports System.Threading
    Imports System.Runtime.InteropServices
    Imports System.Diagnostics

    Module mod_bas
    Private t As Thread
    Public m_xlApp As Object = Nothing

    'hiermit wird verweis auf object excel m_xlApp erstellt

    Public Function Is_Excel_Running() As Boolean

    Dim Result As Boolean = Nothing

    Try

    Dim P As Process() = Process.GetProcessesByName("EXCEL")
    Dim CountLength As Integer = P.Length

    If CountLength <> 0 Then
    'Optional
    'Excel ist bereits gestartet wir haengen uns an excel instanz.
    m_xlApp = CType(Marshal.GetActiveObject("Excel.Application"), _
    xlMa.Application)
    Result = True
    End If

    Catch e As Exception
    If Not m_xlApp Is Nothing Then
    m_xlApp = Nothing
    End If
    Result = False
    End Try

    Return Result
    End Function
    End Module[/vbnet]

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

    @1978lazigo Es wäre schön, wenn Du Deinen Code in einen Code-Tag packen würdest.
    ====
    Blöder Effekt:
    Dieses Testprogramm starten, Excel abfragen: Resultat = False.
    Excel starten, Excel abfragen: Resultat = True.
    Excel beenden, Excel abfragen: Resultat = True.
    :?:
    Selbst mit der Abfrage If P.Length <> 0 AndAlso Not P(0).HasExited Then kommt da das falsche Resultat.
    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

    jan99 schrieb:

    ich habe das soweit hinbekommen, das zumindest derzeit kein Fehler kommt.

    Dann wäre es sinnvoll wenn du uns deinen jetzigen Code zeigst denke ich.

    jan99 schrieb:

    In der Taskliste ist Excel geschlossen - aber ich aber auch gemacht.

    Sorry, das ist kein Deutscher Satz. Weis nicht was du meinst.

    Sei so gut und gib dir beim Antworten etwas mehr mühe, du willst ja das vernünftige Antworten kommen oder? Zeig was du nun hast und beschreibe genau was passiert oder nicht passiert.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ist Excel gestartet

    Sorry mein Fehler. Die Funktion [Is_Excel_Running()] sollte Memberfunktion einer Klasse sein.

    Machen Sie bitte folgendes:
    Erstellen Sie ein Windows Forms-Anwendungsprojekt und geben Sie dem neuen Formular den Namen "Excel_Run"
    Fügen Sie einen Buttom (Button1) dem Formular (Form1) hinzu.
    Fügen Sie der Projektmappe eine Klasse (Class1) hinzu.

    Class1 soll folgenden Code haben.

    VB.NET-Quellcode

    1. Imports xlMa = Microsoft.Office.Interop.Excel
    2. Imports System.Runtime.InteropServices
    3. Public Class Class1
    4. Private m_xlApp As Object = Nothing
    5. Public Function Is_Excel_Running() As Boolean
    6. Dim Result As Boolean = Nothing
    7. Try
    8. Dim P As Process() = Process.GetProcessesByName("EXCEL")
    9. Dim CountLength As Integer = P.Length
    10. If CountLength <> 0 Then
    11. 'Optional
    12. 'Excel ist bereits gestartet wir haengen uns an excel-instanz
    13. m_xlApp = CType(Marshal.GetActiveObject("Excel.Application"),
    14. xlMa.Application)
    15. m_xlApp = Nothing
    16. Result = True
    17. End If
    18. Catch e As Exception
    19. If Not m_xlApp Is Nothing Then
    20. m_xlApp = Nothing
    21. End If
    22. Result = False
    23. End Try
    24. Return Result
    25. End Function
    26. End Class


    Folgende Zeilen sind für Form1 bestimmt

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Compare Text
    3. Option Strict Off
    4. Public Class Form1
    5. Dim clsEx As New Class1
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. If clsEx.Is_Excel_Running() Then
    8. MsgBox("excel lief")
    9. Else
    10. MsgBox("excel lief nicht")
    11. End If
    12. End Sub
    13. End Class


    Projekt kompilieren. Excel starten und testen.

    Das ist alles
    @1978lazigo Und was sagt Dein Test mit meiner Vorgehensweise (Programm starten, Excel starten, Excel beenden und immer testen)?
    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!
    Moin!

    ich muss meine Antwort nochmal ändern.

    Habe den Code von #10 verwendet und obwohl Excel schon länger geschlossen ist sind in der Taskliste noch 3 Prozesse gelistet.

    Mit jeder diesem Aufrufen der Funktion kommt ein Prozess hinzu!!!

    Kann es sein, dass dort noch etwas "zerstört" werden muss??

    Gruß Jan

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

    @jan99 Das ist ganz merkwürdig, deswegen hab ich auch die "ketzerischen" Fragen gestellt.
    Es kann sein, dass das Betriebssystem da einen Rumpf an Exel stehen lässt, um beim nächsten Start schneller zu sein. Dieser Rumpf würde dann von Deinem Programm erkannt werden.
    Teste folgendes:
    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!
    @jan99 Ich beziehe mich auf das Problem, dass es nicht sicher zu ermitteln ist, ob Excel läuft, mit welchem Code auch immer.
    Ersetze in diesem Falle in Deinem aktuellen Code "Excel" nacheinander durch "Notepad" und "Calc" und berichte, was Tests mit diesen Programmen ergeben.
    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!
    Moin!

    ich habe jetzt mir den Code nachfolgend modifiziert und dann funktioniert es:

    VB.NET-Quellcode

    1. Public Function IsExcelRunning() As Boolean
    2. Dim Result As Boolean = Nothing
    3. Try
    4. Dim TestValue As Integer = 0
    5. Dim P As Process() = Process.GetProcessesByName("EXCEL")
    6. For i As Integer = 0 To P.Count - 1
    7. TestValue += CInt(P(i).MainWindowHandle)
    8. Next
    9. If TestValue > 0 Then Return True
    10. Catch e As Exception
    11. Result = False
    12. End Try
    13. Return Result
    14. End Function


    Gruß Jan

    jan99 schrieb:

    und dann funktioniert es:
    Na aber :!:

    VB.NET-Quellcode

    1. For Each pr In P
    2. If pr.MainWindowHandle <> IntPtr.Zero Return True
    3. Next

    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!