Herausfinden, ob Script/.exe von bestimmtem Script/exe ausgeführt worden ist

  • Hallo,
    Habe mich vor ein paar Tagen das erste mal mit AutoIT beschäftigt und komme seitdem eigentlich gut zurecht.
    Habe mich schon in die GUI und ein bisschen pixelsearch eingearbeitet. Jetzt habe ich nur ein Problem für meine 2te GUI.
    Und zwar soll diese GUI nur von meiner Config-exe aufgerufen werden. Ansonsten soll sich das ganze skript sofort beenden.

    Gibt es also eine If WinOpenedBy() Funktion oder so etwas ähnliches? Andernfalls fällt mir gerade ein, dass ein, von meinem SKript gestarteter Prozess eigentlich ein Child-Prozess von eben diesem sein sollte. Deswegen die andere Frage: könnte ich nachschauen ob ein Prozess ein Child Prozess eines anderen ist?.

    Danke und Gruß SEuBo

  • also du hast datei 1 ( config datei)
    und datei 2(die datei mit der gui)

    und du möchtest das datei 2 nur aufgerufen werden kann durch datei 1?
    und wenn sie nicht mit datei 1 aufgerufen wird soll sich datei 2 wieder schließen?

  • Genau so ist es. Genau genommen handelt es sich um 2 GUIs.
    1. ConfigGUI.exe und 2. SEuBoGUI.exe

    In der ConfigGUI ist eine Button integriert, die SEuBoGUI.exe startet.

    Spoiler anzeigen

    SEuBoGUI.exe soll nun am anfang seines Skriptes checken ob es von "ConfigGUI.exe" gestartet wurde. Ansonsten soll es sich halt wieder schließen.

  • hmm

    ich häte ne idee

    bei druck auf den buton einen eintrag in der regesty erstellen
    dann 2. gui öffnen
    und die 2. gui schaut ob der eintrag vorhanden ist
    wenn ja öfnet die datei sich und löscht den eintrag wieder(da sonst die datei nach dem 1. mal ausführen auch von einem anderen programm aus gestartet werden kann)

    [autoit]

    Case $button
    RegWrite("deinen schlüssel in der regestry, "deinen wert z.b ok")
    run ("deine 2. gui")

    [/autoit]


    dies bei dem 1. script einfügen

    [autoit]

    if RegRead("dein schlüssel","dein wert") = "ok" then "der rest des scriptes"
    if RegRead("dein schlüssel","dein wert") = 1 then exit

    [/autoit]


    und dies am anfang deiner 2. gui

  • Würde für mich noch zu unübersichtlich und kompliziert werden das ganze in einem Script zu machen.
    Da würd ich als Anfänger schlicht und ergreifend die Übersicht verlieren. Außerdem habe ich schon ein vernünftiges Konzept für 2 GUI's ausgearbeitet. Ich müsste dann auch wieder alle Funktionen umschreiben und so weiter. Alles was ich brauche ist n kleiner Befehl. Wird ja wohl möglich sein ^^ In Html und php kann man ja auch einfach den Referrer, also die Seite von welcher weitergeleitet wurde checken.


  • ....bei druck auf den buton einen eintrag in der regesty erstellen ..

    Stimmt, das wär eigentlich auch machbar mit einer einfachen .ini Datei wo ich dann mittels

    [autoit]


    IniWrite("Config.ini","General","SwitchGUI", 1)

    [/autoit]

    und im 2ten script mit

    [autoit]

    $Legitim = IniRead("Config.ini","General","SwitchGUI",0)
    If $Legitim = 0 Then
    Exit
    Else IniDelete("Config.ini","General","SwitchGUI")
    EndIf

    [/autoit]


    arbeiten könnte

    Übergangsweise werde ich das so machen aber ich würd doch schon gern wissen ob das auch anders geht.

    Gruß

    • Offizieller Beitrag

    Wenn ich das richtig verstanden habe dann haben beide Programme eine Gui . Also wäre das naheliegenste, das du die Existenz diese Gui abfragst .

    Spoiler anzeigen
    [autoit]

    If Not WinExists("Irgendeintitel") Then
    MsgBox(0, "", "Hauptprogramm läuft nicht")
    Exit
    EndIf

    [/autoit]

    Irgendeintitel einfach durch den Fenstertitel deiner Gui des Hauptprogramms ersetzen .
    Edit: 2.Möglichkeit,du prüfts ob ConfigGui.exe läuft :

    Spoiler anzeigen
    [autoit]

    If Not ProcessExists("ConfigGUI.exe") Then
    MsgBox(0, "Fehler", "Configurator läuft nicht ")
    Exit
    EndIf

    [/autoit]
  • Hi

    Einfachste Mögichkeit:
    Du übergibst einen Commandlineparameter:

    Script1:

    [autoit]

    Run(@ScriptDir & "\Script2.exe OK")

    [/autoit]


    Script2:

    [autoit]

    If $CmdLine[0] <> 1 Then Exit
    If $CmdLine[1] <> "OK" Then Exit

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "Hurra", "Script 2 wurde erfolgreich gestartet")

    [/autoit]


    2 Möglichkeit:
    Du checkst, ob die PID ein Childprocess vom PID (Fenstertitel) ist:
    Script1:

    [autoit]

    GUICreate("Script 1")
    GUISetState()
    Runwait(@ScriptDir & "\Script2.exe")

    [/autoit]


    Script2:

    [autoit]

    $iPidParent = WinGetProcess("Script 1")
    $aChildProcesses = _ProcessGetChildren($iPidParent)
    If @error Then Exit
    $bRun = False
    For $i = 1 To $aChildProcesses[0][0]
    If $aChildProcesses[$i][0] = @AutoItPID Then $bRun = True
    Next
    If $bRun = False Then Exit

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "Hurra", "Script 2 wurde erfolgreich gestartet")

    [/autoit][autoit][/autoit][autoit]

    Func _ProcessGetChildren($i_pid) ; First level children processes only
    Local Const $TH32CS_SNAPPROCESS = 0x00000002
    Local $a_tool_help = DllCall("Kernel32.dll", "long", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPPROCESS, "int", 0)
    If IsArray($a_tool_help) = 0 Or $a_tool_help[0] = -1 Then Return SetError(1, 0, $i_pid)
    Local $tagPROCESSENTRY32 = _
    DllStructCreate _
    ( _
    "dword dwsize;" & _
    "dword cntUsage;" & _
    "dword th32ProcessID;" & _
    "uint th32DefaultHeapID;" & _
    "dword th32ModuleID;" & _
    "dword cntThreads;" & _
    "dword th32ParentProcessID;" & _
    "long pcPriClassBase;" & _
    "dword dwFlags;" & _
    "char szExeFile[260]" _
    )
    DllStructSetData($tagPROCESSENTRY32, 1, DllStructGetSize($tagPROCESSENTRY32))
    Local $p_PROCESSENTRY32 = DllStructGetPtr($tagPROCESSENTRY32)
    Local $a_pfirst = DllCall("Kernel32.dll", "int", "Process32First", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32)
    If IsArray($a_pfirst) = 0 Then Return SetError(2, 0, $i_pid)
    Local $a_pnext, $a_children[11][2] = [[10]], $i_child_pid, $i_parent_pid, $i_add = 0
    $i_child_pid = DllStructGetData($tagPROCESSENTRY32, "th32ProcessID")
    If $i_child_pid <> $i_pid Then
    $i_parent_pid = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID")
    If $i_parent_pid = $i_pid Then
    $i_add += 1
    $a_children[$i_add][0] = $i_child_pid
    $a_children[$i_add][1] = DllStructGetData($tagPROCESSENTRY32, "szExeFile")
    EndIf
    EndIf
    While 1
    $a_pnext = DllCall("Kernel32.dll", "int", "Process32Next", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32)
    If IsArray($a_pnext) And $a_pnext[0] = 0 Then ExitLoop
    $i_child_pid = DllStructGetData($tagPROCESSENTRY32, "th32ProcessID")
    If $i_child_pid <> $i_pid Then
    $i_parent_pid = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID")
    If $i_parent_pid = $i_pid Then
    If $i_add = $a_children[0][0] Then
    ReDim $a_children[$a_children[0][0] + 11][2]
    $a_children[0][0] = $a_children[0][0] + 10
    EndIf
    $i_add += 1
    $a_children[$i_add][0] = $i_child_pid
    $a_children[$i_add][1] = DllStructGetData($tagPROCESSENTRY32, "szExeFile")
    EndIf
    EndIf
    WEnd
    If $i_add <> 0 Then
    ReDim $a_children[$i_add + 1][2]
    $a_children[0][0] = $i_add
    EndIf
    DllCall("Kernel32.dll", "int", "CloseHandle", "long", $a_tool_help[0])
    If $i_add Then Return $a_children
    Return SetError(3, 0, 0)
    EndFunc ;==>_ProcessGetChildren

    [/autoit]

    lgE