_ExchangeVariables_SetVariable

  • Hey Leute:

    hab mal ne Frage zu folgendem Skript:


    script1.au3

    [autoit]


    #include "ExchangeVariables.au3"
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>
    HotKeySet("{ENTER}", "_SendScreenShot")
    Global $bDone = False
    _ExchangeVariables_Startup(1, 'ExchangeVariables Send Bitmap Example')
    While 1
    Sleep(10)
    WEnd
    Func _SendScreenShot()
    Local $hBmp = _ScreenCapture_Capture()
    Local $hDC = _WinAPI_GetDC(0)
    Local $tBitmapInfo = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBitmapInfo, "Size", DllStructGetSize($tBitmapInfo))
    _WinAPI_GetDIBits($hDC, $hBmp, 0, 0, 0, DllStructGetPtr($tBitmapInfo), 0)
    Local $iSize = DllStructGetData($tBitmapInfo, "SizeImage")
    Local $iWidth = DllStructGetData($tBitmapInfo, "Width")
    Local $iHeight = DllStructGetData($tBitmapInfo, "Height")
    DllStructSetData($tBitmapInfo, "Compression", 0); Keine Ahnung, warum man das wieder reseten muß...
    Local $sSize = "byte[" & $iSize & "]"
    Local $tBits = DllStructCreate($sSize)
    Local $iLines = _WinAPI_GetDIBits($hDC, $hBmp, 0, $iHeight, DllStructGetPtr($tBits), DllStructGetPtr($tBitmapInfo), 0)
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_ReleaseDC(0, $hDC)
    _ExchangeVariables_SetVariable(2, "tBitmapInfo", $tBitmapInfo, $tagBITMAPINFO)
    _ExchangeVariables_SetVariable(2, "tBits", $tBits, $sSize)
    _ExchangeVariables_SetVariable(2, "bSent", True)
    $tBits = 0
    EndFunc ;==>_SendScreenShot

    [/autoit]


    script2.au3

    [autoit]


    #include "ExchangeVariables.au3"
    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    $pID = Run(@ScriptDir & "\Script1.exe")
    HotKeySet("{ESC}", "_Exit")
    Global $tBits, $tBitmapInfo, $bSent = False
    _GDIPlus_Startup()
    _ExchangeVariables_Startup(2, 'ExchangeVariables Send Bitmap Example', '_VarMsg')
    Global $hBitmap
    While 1
    Sleep(100)
    WEnd
    _GDIPlus_Shutdown()
    Func _VarMsg($hWnd, $iMsg, $wParam, $lparam)
    If $bSent = True Then
    Local $iWidth = DllStructGetData($tBitmapInfo, "Width")
    Local $iHeight = DllStructGetData($tBitmapInfo, "Height")
    Local $hDC = _WinAPI_GetDC(0)
    Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
    _WinAPI_SetDIBits(0, $hBmp, 0, $iHeight, DllStructGetPtr($tBits), DllStructGetPtr($tBitmapInfo), 0)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
    _GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\Receive.bmp")
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_ReleaseDC(0, $hDC)
    $tBits = 0
    $tBitmapInfo = 0
    $bSent = False
    MsgBox(0, "Bild erhalten", "Script 2 hat ein Bild erhalten und unter: " & @ScriptDir & "\Receive.bmp gespeichert")
    _Exit()
    EndIf
    EndFunc ;==>_VarMsg
    Func _Exit()
    ProcessClose($pID)
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    Script1.au3 zuerst als EXE compilieren
    Script2.au3 ausführen (startet automatisch Script1.exe)
    dann Enter drücken


    Vielen dank an: eukalyptus


    meine Frage:


    [autoit]

    _ExchangeVariables_SetVariable(2, "tBits", $tBits, $sSize)

    [/autoit]

    2 ist für die ScriptID-ummer, an die es gesenet wird

    tBits ist die Variable, in die es geschrieben wird...

    $tBits ist der Wert, der in diese Variable geschrieben wird, ABER WAS ZUM TEUFEL IST $sSize???


    Kann mir das jemand erklären??


    Vielen dank!

  • Steht doch in der UDF drin:

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _ExchangeVariables_SetVariable()
    ; Description ...: Set the value of the variable in the other script
    ; Syntax ........: _ExchangeVariables_SetVariable($iID, $sVariable, $Variant)
    ; Parameters ....: $iID - Identifier number of the script to set the variable
    ; $sVariable - Name of the variable of the other script
    ; $Variant - Variable/Value to set
    ; $sExtended - Additional information:
    ; - Variable is a DllStruct: A string representing the structure
    ; Return values .: Success - True
    ; Failure - False
    ; Author ........: Eukalyptus
    ; Modified ......:
    ; Remarks .......:
    ; Related .......: Eval, IsDeclared, Assign
    ; Link ..........:
    ; Example .......:
    ; =================================================================================================

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

    Func _ExchangeVariables_SetVariable($iID, $sVariable, $Variant, $sExtended='')
    Local Static $hWnd = __ExchangeVariables_GetHwnd($iID), $iID_Old = $iID
    If Not IsHWnd($hWnd) Or $iID <> $iID_Old Then $hWnd = __ExchangeVariables_GetHwnd($iID)
    If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)

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

    Local $sVariant = __ExchangeVariables_VariantToString($Variant, $sExtended)
    Local $iType = @extended
    Local $tVariable = DllStructCreate('Char[' & StringLen($sVariable) & ']')
    DllStructSetData($tVariable, 1, $sVariable)
    Local $tVariant = DllStructCreate('Char[' & StringLen($sVariant) & ']')
    DllStructSetData($tVariant, 1, $sVariant)
    Local $tStruct = DllStructCreate('DWord;DWord;DWord;Ptr;DWord;Ptr')
    DllStructSetData($tStruct, 1, 3)
    DllStructSetData($tStruct, 2, $iType)
    DllStructSetData($tStruct, 3, StringLen($sVariable))
    DllStructSetData($tStruct, 4, DllStructGetPtr($tVariable))
    DllStructSetData($tStruct, 5, StringLen($sVariant))
    DllStructSetData($tStruct, 6, DllStructGetPtr($tVariant))

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

    Local $aReturn = DllCall('User32.dll', 'ptr', 'SendMessage', 'HWnd', $hWnd, 'Int', $_ExchangeVariables_Msg, 'DWord', _WinAPI_MakeLong(@AutoItPID, $iID), 'Ptr', DllStructGetPtr($tStruct))
    If @error Or Not IsArray($aReturn) Or Not $aReturn[0] Then Return SetError(2, 0, 0)
    Return SetError(0, 0, $aReturn[0])
    EndFunc ;==>_ExchangeVariables_SetVariable

    [/autoit]


    Zusätzliche Information, ist aber optional, brauchste also nicht mit angeben.

  • Ne, weil wenn ich die Lösche, dann kommt die Variable nicht richtig an...


    und ich habs gelesen! muss also mehr als nur nen kommentar sein...!

  • na ich hab das programm oben genommen, den besagten Parameter weggenommen und dann versucht, den besagten screenshot im bild zu speichern... FEHLGESCHLAGEN...
    Er speichert ein Bild... Aber als Weißen bildschirm!

    EDIT:

    --> Weiß also immer noch nicht, wofür

    [autoit]

    $sExtended

    [/autoit]

    ist...

    kann mir das nich jemand erklären??

    2 Mal editiert, zuletzt von Mr_gitarre (22. September 2010 um 16:54)

  • Hi

    Schau dir mal die Hilfe zu DllStructCreate an.
    Man muß beim Erstellen angeben, welche Datentypen sich darin befinden, und das steht in $sSize (sollte vielleicht $tagSize heißen ;))

    Man muß natürlich auch Script 2 mitteilen, welche Datentypen dies sind und das macht man mit $sExtended

    mfgE

  • also wird dem 2 script damit mitgeteilt, was für eine Variable da gespeichert wird..??

    Ob Int oder Bool oder wie?

    ...ich hab mir den wert in Script 1 von $Extended mal anzeigen lassen.... Da steht NICHTS drin...!!

    Das heißt, ich weiß Immernoch nicht, wofür das denn jetzt gebraucht wird, wenn doch eh NICHTS übergeben wird...

    *am verzweifeln bin...

  • Sorry.. ich habe den falschen wert ausgegeben...

    es steht DOCH was drin...

    und dieser wert...

    Kommt WO im script 2 an..??

    nehmen wir einfach mal den $tagBITMAPINFO aus Script 1... Dieser Existiert ja unter diesem Namen nicht in Script 2...!!

    Wo ist dieser in Script 2 wiederzufinden....??