$cmdline parameter handle

  • Hi Leute
    Also gleich mal zu meinem Prob ich möchte über $cmdline einen Datenhandle zwischen zwei gleichen Progs
    ausführen ohne Winhandle. Nu ist das so das ich über prog A keine $var in prog B verändern kann.Ich möchte die Daten bzw FileNamen
    auch nicht extern auslagern.Gibts da irgentwie eine andere möglichkeit ?(

  • Du kannst z.B. über ControlSetText bei einem unsichtbaren Label des zweiten Programmes den Text ändern. Das zweite Programm prüft zyklisch ob sich der Text des Labels geändert hat und setzt dann dementsprechend die Variable.

    Genau das will ich net. Ich habe nämlich vor einen Multiselect input über externe *.files einzubauen. und das mit der zyklischen abfrage wirkt dan auf den
    User ob das Prog irgentwie fehlerhaft ist.die Daten sollten eins zu eins verarbeitet werden!! Also die übertragung sollte möglicherweise in einem Rutsch erfolgen

  • Genau das will ich net. Ich habe nämlich vor einen Multiselect input über externe *.files einzubauen. und das mit der zyklischen abfrage wirkt dan auf den
    User ob das Prog irgentwie fehlerhaft ist.die Daten sollten eins zu eins verarbeitet werden!! Also die übertragung sollte möglicherweise in einem Rutsch erfolgen

    eine abfrage alle 100-200 ms is doch vollkommen ausreichend für den "einen Rutsch". So kannst du ja sogar mehrere verschiedene Befehle an das zweite Programm übergeben. Abhängig vom Text im Input-feld wird die entsprechende Funktion ausgeführt, und danach das input feld wieder gelöscht.

  • Netter Player bisher Daniel ;)
    Ich verstehe aber immer noch nicht ganz was du erreichen willst. Warum nimmst du nicht Drag 'n' Drop?

    danke fürs Lob :D

    Also Drag 'n' Drop kommt auf jeden Fall noch mit in die Packung (frühe BetaPhase), Auch eine Grafisch ausgereifte Oberfläche.

    SEuBo
    du sagst das ich mit verzögerung arbeiten soll. Doch das Problem ist dabei das es zu Fehlern kommen kann da man nicht sagen kann wie ausgelastet ein rechner ist. Das würde bedeuten das wenn jemand eine starke CPU auslasstung hat und sagen wir mal 1000 mp3 auf einmal Läd und diese Magische Grenze von 100 - 200 ms überschreitet das er dan die vorgehenden mp3 überspringen würde (schon getestet) :(

  • Kommunikation zwischen 2 Skripten über WM_Copydata.

    Spoiler anzeigen
    [autoit]


    ;Script2 -> Sender
    #include "MessageHandler.au3"

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

    $Local_ReceiverID_Name = "Script2sReceiverID";This is the ID that the other script will use to send data
    $Remote_ReceiverID_Name = "Script1sReceiverID";This is the ID of the script we want to send data too

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

    $hwnd = _SetAsReceiver($Local_ReceiverID_Name)
    ConsoleWrite("hwnd of the Local_ReceiverID_Name is " & $hwnd & @crlf)
    $myFunc = _SetReceiverFunction("_MyFunc2")
    ConsoleWrite("My data receiver function is " & $myFunc & @crlf)

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

    $Str = InputBox(@ScriptName," I am " & @ScriptName & @crlf & "Enter some data to be sent to the other script")

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

    $iSent = _SendData($Str,$Remote_ReceiverID_Name)

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

    While 1
    sleep(100)
    WEnd

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

    Func _MyFunc2($vText)
    Msgbox(0,@ScriptName,@ScriptName & " has received a message" & @crlf & $vText)
    Exit
    EndFunc

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

    ;Script1 -> Empfänger
    #include "MessageHandler.au3"

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

    $Local_ReceiverID_Name = "Script1sReceiverID";This is the ID that the other script will use to send data
    $Remote_ReceiverID_Name = "Script2sReceiverID";This is the ID of the script we want to send data too

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

    $hwnd = _SetAsReceiver($Local_ReceiverID_Name)
    ConsoleWrite("hwnd of the Local_ReceiverID_Name is " & $hwnd & @crlf)
    $myFunc = _SetReceiverFunction("_MyFunc2")
    ConsoleWrite("My data receiver function is " & $myFunc & @crlf)

    [/autoit]

    Per cmdline:

    Spoiler anzeigen
    [autoit]


    #Include <Array.au3>
    #Include <GUIConstantsEx.au3>

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

    Opt('WinTitleMatchMode', 3)

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

    global const $TITLE_RECEIVER = 'DVBViewerSleepTimerReceiver'
    global const $WM_COPYDATA = 0x004A
    Global $NewDataAvailable = False, $avData[1]

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

    if WinExists($TITLE_RECEIVER) then
    ; Kommandozeile an schon laufendes Skript weitergeben
    ;MsgBox(1, "", "aha")
    If $CMDLINE[0] = 0 Then Exit
    _SendData(WinGetHandle($TITLE_RECEIVER),$CMDLINERAW)
    Exit
    else
    ; Empfänger mit normalem Skript starten
    _Receiver()
    Exit
    endif

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

    func _Receiver()
    GUICreate($TITLE_RECEIVER)
    GUIRegisterMsg($WM_COPYDATA, '_WM_COPYDATA')

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

    while 1
    Sleep(10)
    if $NewDataAvailable then
    $NewDataAvailable = False
    $sMsg = $avData[1]
    _ArrayDelete($avData,1)
    $aMsg = _ParseCMDLine($sMsg)
    For $i = 0 To UBound($aMsg)-1
    Switch $aMsg[$i][1]
    Case "dauer"
    MsgBox(0, '', "Dauer anzeigen")
    Case "stop"
    MsgBox(0, '', "beenden")
    Exit
    EndSwitch
    Next
    endif
    wend

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

    GUIDelete()
    endfunc; _Receiver

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

    ;===============================================================================
    ;
    ; Function Name: _ParseCMDLine($CMDString)
    ; Description:: Parses a CMD-String to Parameters with Values
    ; Parameter(s): $CMDString -> String to parse
    ; Requirement(s): ?
    ; Return Value(s): Error: 0 and @error = StringRegExp-Error
    ; Success: 2 Dimensional Array:
    ; $array[$i][0] : Parameter including value
    ; $array[$i][1] : Parameter
    ; $array[$i][2] : Value with quotation marks (only if value has quotaion marks)
    ; $array[$i][3] : Value without quotation marks
    ; Author(s): Prog@ndy
    ;
    ; Basis: http://regexlib.com/REDetails.aspx?regexp_id=1220
    ;===============================================================================
    ;
    Func _ParseCMDLine($CMDString)
    Local $y, $j, $i, $entry
    Local $x = StringRegExp($CMDString,'(?:\s*)(?<=[-|/])(?<name>[^\s-|/:|=]*)(?:(?:[:|=](?:("(?<value1>.*?)(?<!\\)")|(?<value>\S*)))|\w*?)',4)
    If @error Then Return SetError(@error,0,0)
    Local $ResultArray[UBound($x)][4]
    For $i = 0 To UBound($x)-1
    $entry = $x[$i]
    For $y = 0 To UBound($entry)-1
    $j = $y
    If $y > 3 Then $j = 3
    $ResultArray[$i][$j] = $entry[$y]
    Next
    Next
    Return $ResultArray
    EndFunc

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

    func _SendData($hWnd, $sData)

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

    local $tCOPYDATA, $tMsg

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

    $tMsg = DllStructCreate('wchar[' & StringLen($sData) + 1 & ']')
    DllStructSetData($tMsg, 1, $sData)
    $tCOPYDATA = DllStructCreate('dword;dword;ptr')
    DllStructSetData($tCOPYDATA, 2, DllStructGetSize($tMsg))
    DllStructSetData($tCOPYDATA, 3, DllStructGetPtr($tMsg))
    $Ret = DllCall('user32.dll', 'lparam', 'SendMessageW', 'hwnd', $hWnd, 'int', $WM_COPYDATA, 'wparam', 0, 'lparam', DllStructGetPtr($tCOPYDATA))
    if (@error) or ($Ret[0] = -1) then
    return 0
    endif
    return 1
    endfunc; _SendData

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

    func _WM_COPYDATA($hWnd, $msgID, $wParam, $lParam)

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

    local $tCOPYDATA = DllStructCreate('dword;dword;ptr', $lParam)
    local $tMsg = DllStructCreate('wchar[' & DllStructGetData($tCOPYDATA, 2)/2 & ']', DllStructGetData($tCOPYDATA, 3))

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

    _ArrayAdd($avData, DllStructGetData($tMsg, 1))
    $NewDataAvailable = True

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

    return 0
    endfunc; _WM_COPYDATA

    [/autoit]