Feststellen von welchem Programm mein Programm aufgerufen wurde.

  • Hallo zusammen,

    ich schreibe ein Autoit Programm, welches von 2 verschiedenen Programmen aufgerufen werden kann.
    Je nachdem welches Programm mein Programm aufgerufen hat, führe ich verschiedene Aktionen aus.
    Diese beiden Programme können leider kein Parameter an mein Programm übergeben, um daran festzustellen,
    welches mein Programm aufgerufen hat.

    Ich suche eine Möglichkeit in meinem Programm festzustellen, welches der beiden Programme das Aufrufende war.

    Kann mir jemand weiterhelfen?

    Gruß,
    VFRRever

    2 Mal editiert, zuletzt von VFRRever (20. April 2011 um 13:55)

  • Moin.

    Das Programm "verursacht" einen Prozeß, den man abfragen kann.

    Einfach schauen ob der Prozeß aktiv ist oder nicht.

    Hiermit kannst Du die Prozeß-IP heraus finden:

    Spoiler anzeigen
    [autoit]


    $Pid=_ProcessGetPid("svchost.exe")

    For $i=1 To $Pid[0]
    MsgBox(0,"","svchost.exe's PID: " & $Pid[$i])
    Next


    ;________________________________________________________________________________
    ;Description: Returns the Process ID's (PID) of a given process name.
    ;Parameters - $sName: The name (ending with .exe) of a currently running process.
    ;Return value: An array containing the Process ID's (PID)
    ; Element 0 contains number of occurences.
    ;Author: Nahuel
    ;__________________________________________________________________________________
    Func _ProcessGetPid($sName)
    If Not ProcessExists($sName) Then
    SetError(1)
    Return ""
    EndIf
    Local $aPList=ProcessList($sName)
    If @error Then Return ""
    Local $aMatches[UBound($aPList)]
    $aMatches[0] = $aPList[0][0]
    For $i=1 To $aPList[0][0]
    $aMatches[$i] = $aPList[$i][1]
    Next
    Return $aMatches
    EndFunc

    [/autoit]


    Und mit etwas "Umbau", kannst Du damit schauen, ob der Prozeß da ist oder nicht.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Spoiler anzeigen
    [autoit]

    #include <Process.au3>

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

    MsgBox(0,"AutoIt-Programm wurde aufgerufen von", _ProcessGetName(ProcessGetParentProcess(@AutoItPID)))

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

    ; Gibt die Process-ID des Prozesses zurück der den angegebenen Prozess erzeugt hatte
    Func ProcessGetParentProcess($PID)
    ;by AspirinJunkie
    Local Static $oWMI = ObjGet("winmgmts:\\localhost\root\CIMV2")
    $PID = ProcessExists($PID)
    If $PID = 0 Then Return SetError(1,0,0)

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

    For $oItem In $oWMI.ExecQuery("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId=" & $PID, "WQL", 0x20 + 0x10)
    Return $oItem.ParentProcessId
    Next

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

    Return SetError(2,0,0)
    EndFunc

    [/autoit]

    Alina
    Die Funktion ProcessExists() macht fast das gleiche wie deine Funktion.
    Gibt die PID eines Prozesses anhand seines Namens zurück.

    @ @night@
    Er schrieb ja eindeutig das eben keine Parameter von diesen Programmen übergeben werden können.

    3 Mal editiert, zuletzt von AspirinJunkie (19. April 2011 um 20:01)

  • Oder du übergibst einfach entsprechende Parameter:

    [autoit]

    Run("C:\Programm.exe programm1")

    [/autoit]


    Nicht getestet, sollte aber funktionieren.
    Welches programm dich aufgerufen hat, kannst du dann in der Variable $cmdline[1] sehen. Das geht natürlich nur, wenn du die beiden Programme selbst geschrieben hast.

  • Probiere es mal damit, d.h. lass' mal deine Programme den Code (Exe) unten starten:

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WinAPIEx.au3>
    $parent_pid = _WinAPI_GetParentProcess(@AutoItPID)
    $filename_parent = _WinAPI_GetProcessFileName($parent_pid)
    Local $msg

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

    GUICreate("My GUI") ; will create a dialog box that when displayed is centered
    GUICtrlCreateLabel("This program has been started by:" & @LF & $filename_parent, 10, 50, 400, 100)
    GUISetState(@SW_SHOW) ; will display an empty dialog box

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

    ; Run the GUI until the dialog is closed
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd
    GUIDelete()

    [/autoit]

    Man benötigt dazu die WinAPIEx.au3!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hallo,

    erst einmal vielen Dank für die schnellen Antworten.

    - Die Lösung mit der Parameterübergabe entfällt ja, wegen der fehlenden Möglichkeit der Parameterübergabe.
    - Die Überwachung der Prozesse funktioniert auch nicht, da beide aufrufenden Programme auch parallel gestartet sein könnten.

    - Die Lösung von AspirinJunkie funktioniert einwandfrei, so etwas habe ich gesucht.

    - Die Lösung von UEZ habe ich nur kurz getestet und dann abgebrochen, da außer der WinAPIEx.au3 dann noch die APIConstants.au3 und dann noch die GuiList.au3 benötigt wird. Die Suche nach den weiteren Include-Dateien war mir dann zu aufwendig ;) . Das werde ich noch mal testen, wenn ich etwas mehr Zeit habe.


    Vielen Dank noch mal,
    VFRRever

  • Stimmt, habe ich gar nicht bemerkt: im Prinzip ist die Idee von AspirinJunkie und meine die Gleiche, nur das er WMI benutzt und ich die WinAPI!

    Hier nochmals der Code ohne WinAPIEx.au3

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    $parent_pid = _WinAPI_GetParentProcess(@AutoItPID)
    $filename_parent = _WinAPI_GetProcessFileName($parent_pid)
    Local $msg
    GUICreate("My GUI")
    GUICtrlCreateLabel("This program has been started by:" & @LF & $filename_parent, 10, 50, 400, 100)
    GUISetState(@SW_SHOW)
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd
    GUIDelete()

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

    Func _WinAPI_CloseHandle($hObject)
    Local $aResult = DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hObject)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0]
    EndFunc ;==>_WinAPI_CloseHandle

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

    Func _WinAPI_GetCurrentProcessID()
    Local $aResult = DllCall("kernel32.dll", "dword", "GetCurrentProcessId")
    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[0]
    EndFunc ;==>_WinAPI_GetCurrentProcessID

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

    Func _WinAPI_GetParentProcess($PID = 0)
    If Not $PID Then
    $PID = _WinAPI_GetCurrentProcessID()
    If Not $PID Then
    Return SetError(1, 0, 0)
    EndIf
    EndIf
    Local $hSnapshot = DllCall('kernel32.dll', 'ptr', 'CreateToolhelp32Snapshot', 'dword', 0x00000002, 'dword', 0)
    If (@error) Or (Not $hSnapshot[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Local $tPROCESSENTRY32 = DllStructCreate('dword Size;dword Usage;dword ProcessID;ulong_ptr DefaultHeapID;dword ModuleID;dword Threads;dword ParentProcessID;long PriClassBase;dword Flags;wchar ExeFile[260]')
    Local $pPROCESSENTRY32 = DllStructGetPtr($tPROCESSENTRY32)
    Local $Ret, $Result = 0
    $hSnapshot = $hSnapshot[0]
    DllStructSetData($tPROCESSENTRY32, 'Size', DllStructGetSize($tPROCESSENTRY32))
    $Ret = DllCall('kernel32.dll', 'int', 'Process32FirstW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32)
    While (Not @error) And ($Ret[0])
    If DllStructGetData($tPROCESSENTRY32, 'ProcessID') = $PID Then
    $Result = DllStructGetData($tPROCESSENTRY32, 'ParentProcessID')
    ExitLoop
    EndIf
    $Ret = DllCall('kernel32.dll', 'int', 'Process32NextW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32)
    WEnd
    _WinAPI_CloseHandle($hSnapshot)
    If Not $Result Then
    Return SetError(1, 0, 0)
    EndIf
    Return $Result
    EndFunc ;==>_WinAPI_GetParentProcess

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

    Func _WinAPI_GetProcessFileName($PID = 0)
    If Not $PID Then
    $PID = _WinAPI_GetCurrentProcessID()
    If Not $PID Then
    Return SetError(1, 0, '')
    EndIf
    EndIf
    Local $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', 0x00000410, 'int', 0, 'dword', $PID)
    If (@error) Or (Not $hProcess[0]) Then
    Return SetError(1, 0, '')
    EndIf
    Local $tPath = DllStructCreate('wchar[1024]')
    Local $Ret = DllCall(@SystemDir & '\psapi.dll', 'int', 'GetModuleFileNameExW', 'ptr', $hProcess[0], 'ptr', 0, 'ptr', DllStructGetPtr($tPath), 'int', 1024)
    If (@error) Or (Not $Ret[0]) Then
    $Ret = 0
    EndIf
    _WinAPI_CloseHandle($hProcess[0])
    If Not IsArray($Ret) Then
    Return SetError(1, 0, '')
    EndIf
    Return DllStructGetData($tPath, 1)
    EndFunc ;==>_WinAPI_GetProcessFileName

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯