1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. skyteddy

Beiträge von skyteddy

  • Kann man auf das Icon zugreifen?

    • skyteddy
    • 30. Mai 2009 um 20:33

    Hallo Funkey,

    dank Dir für die schnelle Antwort!

    Na das ist ja einfach :) Ich hab viel zu kompliziert gedacht. Das Icon ist aber nur 32x32 groß und wenn ich das Control größer mache, wird das ganze pixelig und sieht nicht mehr schön aus.

    Kann man irgendwie ein png oder jpg in das Programm integrieren und das dann benutzen? Ich meine jetzt nicht FileInstall, denn FileInstall muß ja die Datei beim Programm-Ausruf irgendwo hinlegen. D.h. in Temp liegt dann beispielsweise die Grafikdatei :( Gibt es da ne andere Möglichkeit, wie ich das Bild integrieren kann?

    Happy computing!
    R@iner

  • Kann man auf das Icon zugreifen?

    • skyteddy
    • 30. Mai 2009 um 19:09

    Hallo Zusammen,

    kann ich vom Programm aus auf das ins Programm compilierte Programm-Icon zugreifen? Und wenn ja, wie?

    Das Icon wird durch die Wrapper-Option "#AutoIt3Wrapper_Icon=meinicon.ico" beim Compilieren vermutlich durch den ResHacker ausgetauscht und in die Exe eingefügt.

    Besten Dank im voraus!
    R@iner

  • Fragen zu GUICtrlListView

    • skyteddy
    • 28. Mai 2009 um 17:55

    Hallo Zusammen,

    zwei nFrage hab ich noch ergänzend zu meinen anderen. Gibt es eine Aufruf, der mir alle Spalten in einem Rutsch auf die optimale Breite zieht, sodaß der Text voll angezeigt wird? Und wie kann ich ein Zeile farbig machen?

    Besten Dank und viele Grüße!
    R@iner

  • Fragen zu GUICtrlListView

    • skyteddy
    • 27. Mai 2009 um 18:17

    Hallo Bert,

    vielen herzlichen Dank für Deine Hilfe. Habe mich heute mal mit dem Beispiel näher beschäftigt und dank Deiner Kommentare und der AutoIt-Hilfe das ein oder andere auch selber erweitern können. Mein Code sieht jetzt so aus:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <Array.au3>

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

    Opt("MustDeclareVars", 1) ; Variablen müssen deklariert werden
    Opt("GUiOnEventMode", 1) ; schaltet in den ONeVENTmODE

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

    Global $Klicks = 0 ; Zählt die Anzahl der Klicks auf Knopf Download

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

    #Region Gui-Erzeugung
    Global $MeinGui = GUICreate("ListView mit Checkboxen", 500, 300, 220, 200) ; GuiFenster erstellen
    GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate") ; Funktion Terminate dem Event $Gui_Event_Close zuordnen

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

    Global $listview = GUICtrlCreateListView("DownLoad?|Name|Firmware Revision", 10, 10, 480, 230, _
    BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT), BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES)) ;$LVS_SHOWSELALWAYS
    ; wichtig ist der Stil $LVS_Report und der eweiterte Stil $LVS_EX_Checkboxes
    ; erzeugt eine Listview mit den Spaltenüberschriften die zurückgegebene ID wird in der Variablen $ListView gespeichert

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

    _GUICtrlListView_SetColumnWidth($listview, 0, 80) ; Breite für Spalte mit Index 0 auf 80 setzen
    _GUICtrlListView_SetColumnWidth($listview, 1, 160) ; Breite für Spalte mit Index 1 auf 160 setzen
    _GUICtrlListView_SetColumnWidth($listview, 2, 160) ; Breite für Spalte mit Index 2 auf 160 setzen

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

    ;ab hier werden die ListViewItems erzeugt mit das "|" ist das Trennzeichen zwischen den Spalten
    For $i = 0 To 70 Step 3
    GUICtrlCreateListViewItem(" |" & $i & " - Speedport W920V | Firmware 65.01.71, Final", $listview)
    GUICtrlCreateListViewItem(" |" & $i + 1 & " - Speedport W701V | Firmware xx.xx.xx, Final", $listview)
    GUICtrlCreateListViewItem(" |" & $i + 2 & " - Speedport W701V | Firmware xy.xx.zz, Beta", $listview)
    Next
    ; Button(s)
    GUICtrlCreateButton("Download", 200, 250, 80, 30) ; Download-Button erzeugen
    GUICtrlSetOnEvent(-1, "_Downloads") ; die Funktion _Downloads dem Event des Buttons zuordnen
    GUISetState(@SW_SHOW) ; wichtig! setzt den Status der Gui mit Standard-Parameter also @SW_Show
    #EndRegion Gui-Erzeugung

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

    #Region Main
    While 1 ;Schleife sehr wichtig!!!!! da sonst die Gui sofort wieder geschlossen wird
    Sleep(100)
    WEnd
    #EndRegion Main

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

    #Region Funktions-Definitionen
    ; Funktion, die beim Drücken des "Donwload"-knopfes aufgerufen wird
    Func _Downloads()
    Local $i, $aItemText ;lokale Variablen definieren

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

    $Klicks += 1 ; Klick-Counter erhöhen
    ConsoleWrite("Download-Klick Nr: " & $Klicks & " - Beginn" & @CRLF) ;evtl. eigene Ausgabe bzw. Vorbereitung des Downloads oder einfach löschen

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

    For $i = 0 To _GUICtrlListView_GetItemCount($listview) - 1
    ;Schleifenbeginn da das erste Item den Index 0 hat von 0 bis Anzahl -1

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

    If _GUICtrlListView_GetItemChecked($listview, $i) Then ; wenn geChecked (angehakt) dann
    $aItemText = _GUICtrlListView_GetItemTextArray($listview, $i)
    ;Inhalt aller Spalten dieser Zeile dem Array $aItemText zuweisen
    ;$aItemText[0] enthält die Anzahl der Spalten
    ;$aItemText[1] Checked oder Unchecked (wir haben aber nur geChecked also keine Auswertung erforderlich)
    ;$aItemText[2] Name
    ;$aItemText[3] Firmware

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

    ; Zeile markieren, die bearbeitet wird
    ; _GUICtrlListView_SetSelectionMark($listview, $i) ; Selectieren geht so nicht
    ; _GUICtrlListView_SetItemFocused($listview, $i, True) ; geht auch nicht
    _GUICtrlListView_SetItemSelected($listview, -1, False, False) ; Alle entfernen
    _GUICtrlListView_SetItemSelected($listview, $i, True, True) ; Nur den einen setzen

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

    ; Automatisch an die Stelle hinscrollen
    _GUICtrlListView_EnsureVisible($listview, $i)

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

    If _FileDown($aItemText) Then ;Aufruf von _FileDown mit dem Wert(en) on $aItemText
    ; - erfolgreicher Download -
    ; In Spalte 0 das Kästchen zum Anhaken entfernen, aber wie? Oder Zeile irgendwie anders kennzeichnen, daß der Download bereits erledigt ist <======================
    ; Oder ganze Zeile "deaktivieren", aber nicht löschen?
    Else
    ; - nicht erfolgreicher Download -> Error-Meldung -
    EndIf

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

    ; Haken rausnehmen
    _GUICtrlListView_SetItemChecked($listview, $i, False)
    EndIf
    Next ;= > weiter mit For

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

    ; Alle Items deselektieren
    _GUICtrlListView_SetItemSelected($listview, -1, False, False) ; Alle entfernen

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

    ; Klicks ausgeben
    ConsoleWrite("Download-Klick Nr: " & $Klicks & " - Ende" & @CRLF)
    EndFunc ;==>_Downloads

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

    ; Dummy-Datei-Download-Funktion
    Func _FileDown($aItemText)
    Local $text = " Download für Item: " & $aItemText[2] & $aItemText[3] & " läuft..."

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

    ConsoleWrite($text)
    ToolTip($text, 1, 1, "Download:")

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

    Sleep(3000) ; simuliert Download

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

    ConsoleWrite(" fertig" & @CRLF)
    ToolTip("")

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

    Return 1
    EndFunc ;==>_FileDown

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

    ; Exit-Funktion
    Func Terminate()
    GUIDelete($MeinGui)
    Exit
    EndFunc ;==>Terminate

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

    #EndRegion Funktions-Definitionen

    [/autoit]

    Jetzt habe ich aber noch folgende Fragen bzw. ungelöste Probleme:

    - Wie kann ich das realisieren, daß bei einem Doppelklick auf eine Zeile die Zeile an- bzw. abgehakt wird? Ich hatte von Bernd mal vor Jahren ein Beispiel für einen Event-Handler, aber der paßt heute hinten und vorne mit der AutoIt-Version nicht mehr zusammen. Hab da jetzt 2 Stunden rumprobiert, finde aber nicht die entsprechenden Funktionen.

    - Wie schaffe ich das, daß der Download-Knopf (oder auch weitere Knöpfe) in der Gui inaktiv sind, solange der Download läuft? Ich will sie nicht ausblenden, aber ein Klicken auf nen Knopf soll quasi ins Leere laufen.
    Ich hab mal testweise GUiOnEventMode abgeschalten und das mit ner While-Schleife und $msg=GUIGetMsg() probiert, aber auch da habe ich das gleiche Problem. Die Events werden irgendwie aufgehoben und nacheinander abgearbeitet :(

    - Nach erfolgreichem Download würde ich gerne die Zeile irgendwie "deaktivieren". Am liebsten wäre es mir, ich könnte den Kasten vorne zum Anhaken entfernen, aber ich schaff das nicht. Oder vielleicht gibt es eine andere Möglichkeit die Zeile zu "deaktivieren" oder farblich zu kennzeichnen, jedenfalls so, daß die Zeile nicht verschwindet.

    Besten Dank und viele Grüße!
    R@iner

  • Fragen zu GUICtrlListView

    • skyteddy
    • 20. Mai 2009 um 13:52

    Oscar :
    An die UDFs denke ich immer nicht :(

    @oliverh:
    Ja, das ist auch ein Ansatz, das ganze Tab zu scrollen.

    Ich schau mir mal beides an, bin aber mittlerweile auf die Idee gekommen, eine Liste daraus zu machen. Fragt sich nur, ob das leichter zu realisieren ist und ob die dann scrollbar ist?!

    Meine Vorstellung wäre ne Liste mit folgendem Aufbau:
    Gerätetyp, Beschreibung (mit Typ: Final or Beta), Knopf oder ähnliches (wo dann meine Download-Funktion startet und die betreffende Firmware runterlädt und an die richtige Stelle hinsortiert)

    Beispiel:
    Speedport W920V | Firmware 65.01.71, Final | [Download]
    Speedport W701V | Firmware xx.xx.xx, Beta | [Download]
    ...

    Ist sowas leichter machbar? Oder ich mach es so wie in dem GUICtrlCreateList-Beispiel und nur eine einspaltige Liste und einen "Download-Knopf" dazu. Dann müßte ich Gerätetyp und Beschreibung in eine Spalte machen, oder ist das Beispiel leicht erweiterbar auf 2 Spalten? autoIt und ich sind Freunde geworden, aber mit der GUI stehe ich irgendwie immer noch auf Kriegsfuß ;)

    Happy computing!
    R@iner

  • Fragen zu GUICtrlListView

    • skyteddy
    • 19. Mai 2009 um 23:18

    Hello again,

    ich heb mal vorsichtig den Finger... hat jemand ne Idee?

    Happy computing!
    R@iner

  • Fragen zu GUICtrlListView

    • skyteddy
    • 19. Mai 2009 um 09:39

    Hallo Zusammen,

    ich und GUIs :( Ich würde gerne eine GUICtrlCreateGroup scrollbar machen, sodaß in meinem Beispiel der "Radio 3" erst erscheint, wenn ich die Gruppe nach unten scrolle und nicht irgendwo in der MainGUI auftaucht. Ich hab mir einige Beispiele angeschaut, aber irgendwie sehr ich den Wald vor lauter Bäumen nicht.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #include <ScrollBarConstants.au3>

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

    Opt('MustDeclareVars', 1)

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

    Example()

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

    Func Example()
    Local $radio_1, $radio_2, $radio_3, $msg

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

    GUICreate("My GUI group") ; will create a dialog box that when displayed is centered

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

    GUICtrlCreateGroup("Group 1", 190, 60, 120, 140, BitOR($WS_VSCROLL, $ES_AUTOVSCROLL))
    $radio_1 = GUICtrlCreateRadio("Radio 1", 210, 90, 50, 20)
    $radio_2 = GUICtrlCreateRadio("Radio 2", 210, 110, 60, 50)
    $radio_3 = GUICtrlCreateRadio("Radio 3", 210, 300, 60, 50) ; Sollte eigentlich in die Group
    GUICtrlCreateGroup("", -99, -99, 1, 1) ;close group

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

    GUISetState() ; 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
    EndFunc ;==>Example

    [/autoit]


    Was muß ich wo ändern?

    Besten Dank im voraus!
    R@iner

  • Wie rufe ich die Methode RenewDHCPLeaseAll auf?

    • skyteddy
    • 13. Mai 2009 um 22:09

    Hallo Bitboy,

    dank Dir für Deine Antwort. Ich hab jetzt eine Lösung gefunden, was aberimmer noch nicht meine Ursprungsfrage beantwortet.

    Spoiler anzeigen
    [autoit]


    ; DHCP auf allen (DHCP-)Karten erneuern
    Func RenewDHCP()

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

    $objWMI = ObjGet("winmgmts:\\.\root\cimv2")
    ; Local $collection = $objWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration") ; Nimmt dann alle Adapter -> nicht gut!
    $collection = $objWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

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

    For $objNetCard In $collection

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

    ; Nur, wenn DHCP aktiv ist
    If $objNetCard.DHCPEnabled <> 0 Then

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

    ; --- Release DHCP ---
    $ret1 = $objNetCard.ReleaseDHCPLease()

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

    ; Error-Handling
    If $ret1 > 1 Then
    MsgBox(16, 'DHCP Release Error on ' & $objNetCard.macaddress, 'There was an unknown error setting DHCP')
    ElseIf $ret1 = 1 Then
    MsgBox(48, 'DHCP Release on ' & $objNetCard.macaddress, 'DHCP was set on the adapter. Please reboot for all changes to take affect')
    Else
    ;no error
    MsgBox(0, 'DHCP Release on ' & $objNetCard.macaddress, 'was succesful')
    EndIf

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

    ; --- Renew DHCP ---
    $ret1 = $objNetCard.RenewDHCPLease()

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

    ; Error-Handling
    If $ret1 > 1 Then
    MsgBox(16, 'DHCP Renew Error on ' & $objNetCard.macaddress, 'There was an unknown error setting DHCP')
    ElseIf $ret1 = 1 Then
    MsgBox(48, 'DHCP Renew on ' & $objNetCard.macaddress, 'DHCP was set on the adapter. Please reboot for all changes to take affect')
    Else
    ;no error
    MsgBox(0, 'DHCP Renew on ' & $objNetCard.macaddress, 'was succesful')
    EndIf

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

    EndIf
    Next
    EndFunc ;==>SetDHCPonAllCards

    [/autoit]


    Happy computing!
    R@iner

  • Wie rufe ich die Methode RenewDHCPLeaseAll auf?

    • skyteddy
    • 13. Mai 2009 um 19:54

    Hallo Zusammen,

    mit ObjGet etc. habe ich so gut wie keine Erfahrung und die Suchfunktion hilft mir auch nicht weiter. Dennoch habe ich es erfolgreich geschafft, durch Spicken in einem anderen Script, alle meine Netzwerkkarten in einem Rutsch mit folgendem Script auf DHCP umzustellen.

    Spoiler anzeigen
    [autoit]


    ; Alle Karten auf DHCP umstellen
    Func SetDHCPonAllCards()

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

    $objWMI = ObjGet("winmgmts:\\.\root\cimv2")
    ; Local $collection = $objWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration") ; Nimmt dann alle Adapter -> nicht gut!
    $collection = $objWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

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

    For $objNetCard In $collection

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

    ; --- enable DHCP ---
    $ret1 = $objNetCard.EnableDHCP()

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

    ; Error-Handling
    If $ret1 > 1 Then
    MsgBox(16, 'DHCP Set Error on ' & $objNetCard.macaddress, 'There was an unknown error setting DHCP')
    ElseIf $ret1 = 1 Then
    MsgBox(48, 'DHCP Set on ' & $objNetCard.macaddress, 'DHCP was set on the adapter. Please reboot for all changes to take affect')
    Else
    ;no error
    MsgBox(0, 'DHCP Set on ' & $objNetCard.macaddress, 'was succesful')
    EndIf
    Next
    EndFunc ;==>SetDHCPonAllCards

    [/autoit]

    Jetzt möchte ich noch ne Funktion schreiben, die alle DHCP-Leases erneuert. Dazu gibt es die Methode "RenewDHCPLeaseAll".

    Nur wie muß die ExecQuery aussehen, damit ich die Methode RenewDHCPLeaseAll erfolgreich absetzen kann?

    Ich hab es in der Schleife probiert, oder auch einzeln, aber ich bekomme immer einen Fehler. :( Wahrscheinlich muß die ganze Query anders ausschauen. Nur wie? ?(

    Hier der Links zu RenewDHCPLeaseAll Method of the Win32_NetworkAdapterConfiguration Class

    Besten Dank
    R@iner

  • Frage zu Struct

    • skyteddy
    • 11. Mai 2009 um 10:41

    Hallo Andy,

    dank Dir für Deine Erklärungen!

    Schöne Woche!
    R@iner

  • Frage zu Struct

    • skyteddy
    • 6. Mai 2009 um 14:13

    Hallo Andy,

    ich will die Reihenfolge nicht verändern, aber ein Vergleich von zwei Strukturen funktioniert weben nicht, weil in der der eingelesenen Structur eben alle Bytes andersrum drin stehen. Wie kann ich denn dann die Bytes einer Structur am besten so hin drehen, daß ich die Inhalte vergleichen kann?

    Happy computing!
    R@iner

  • Frage zu Struct

    • skyteddy
    • 6. Mai 2009 um 11:15

    Hallo Zusammen,

    ich habe ein Verständnisproblem mit dem Befüllen einer Structur. Ich befülle einmal die Structur als Structur und einmal in einem Rutsch als Byte-Array. Doch leider werden hier die Bytes gedreht und ich weiß nicht warum.

    Also speziell meine ich den Unterschied zwischen dem Befüllen einer kompletten Structur in einem String und meiner TestStructur mit 2 einzelnen SetData. Da sind die Bytes gedreht. ?(

    Hier mein Testcode mit Ausgaben in die Console.

    Spoiler anzeigen
    [autoit]


    Opt("MustDeclareVars", 1)

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

    ; Struktur definieren
    Global Const $MyStruct = _ ; 16 Byte in der Summe
    "short Sequenz1;" & _ ; 2 Byte
    "byte Part1A;" & _ ; 1 Byte
    "byte Part1B;" & _ ; 1 Byte
    "uint Address1;" & _ ; 4 Byte
    "short Sequenz2;" & _ ; 2 Byte
    "byte Part2A;" & _ ; 1 Byte
    "byte Part2B;" & _; 1 Byte
    "uint Address2;" ; 4 Byte

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

    ; Angenommene Daten die vom Router zurückkommen
    ; In Hex: 00 01, 1a, 1b, 11 22 33 44, 00 02, 2a, 2b, 55 66 77 88
    Local $BinaryDataFromUDP = "0x00011a1b1122334400022a2b55667788" ; 16 Byte
    Ausgabe("$BinaryDataFromUDP", $BinaryDataFromUDP) ; Testausgabe

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

    #Region --- UDP-Daten ---
    ; Datensatz (als Struktur)
    Global $UDPStruct = DllStructCreate($MyStruct)

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

    ; Datensatz (als Byte-Ansammlung)
    Global $UDPBinStruct = DllStructCreate("byte[" & DllStructGetSize($UDPStruct) & "]", DllStructGetPtr($UDPStruct))

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

    ; Daten setzen
    DllStructSetData($UDPBinStruct, 1, $BinaryDataFromUDP)

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

    ; Ausgabe in Dezimal
    StructAusgabeDec("$UDPStruct", $UDPStruct)
    ; Ausgabe in Hex
    StructAusgabeHex("$UDPStruct", $UDPStruct)
    #EndRegion --- UDP-Daten ---

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

    #Region --- Meine Test-Daten ---
    ; Datensatz (als Struktur)
    Global $TestStruct = DllStructCreate($MyStruct)

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

    ; Testweise etwas setzen
    DllStructSetData($TestStruct, "Sequenz1", "0x0001") ; 2 Byte, wie oben in $BinaryDataFromUDP
    DllStructSetData($TestStruct, "Address1", "0x11223344") ; 4 Byte, wie oben in $BinaryDataFromUDP

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

    ; Datensatz (als Byte-Ansammlung)
    Global $TestBinStruct = DllStructCreate("byte[" & DllStructGetSize($TestStruct) & "]", DllStructGetPtr($TestStruct))
    Ausgabe("$TestBinStruct", DllStructGetData($TestBinStruct, 1)) ; Testausgabe

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

    ; Ausgabe in Dezimal
    StructAusgabeDec("$TestStruct", $TestStruct)
    ; Ausgabe in Hex
    StructAusgabeHex("$TestStruct", $TestStruct)
    #EndRegion --- Meine Test-Daten ---

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

    Ausgabe("", @CRLF & @CRLF)
    Exit

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

    #Region --- Funktionen ---

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

    ; Funktion, die MyStruct in Dec ausgibt
    Func StructAusgabeDec($name, $struct)
    Local $msg = "Struct Size: " & DllStructGetSize($struct) & @CRLF & _
    "Struct pointer: " & DllStructGetPtr($struct) & @CRLF & _
    "Data:" & @CRLF & _
    DllStructGetData($struct, "Sequenz1") & @CRLF & _
    DllStructGetData($struct, "Part1A") & @CRLF & _
    DllStructGetData($struct, "Part1B") & @CRLF & _
    DllStructGetData($struct, "Address1") & @CRLF & _
    DllStructGetData($struct, "Sequenz2") & @CRLF & _
    DllStructGetData($struct, "Part2A") & @CRLF & _
    DllStructGetData($struct, "Part2B") & @CRLF & _
    DllStructGetData($struct, "Address2")

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

    Ausgabe('Struct "' & $name & '" in Dec', $msg)
    EndFunc ;==>StructAusgabeDec

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

    ; Funktion, die MyStruct in Hex ausgibt
    Func StructAusgabeHex($name, $struct)
    Local $msg = "Struct Size: " & DllStructGetSize($struct) & @CRLF & _
    "Struct pointer: " & DllStructGetPtr($struct) & @CRLF & _
    "Data:" & @CRLF & _
    Hex(DllStructGetData($struct, "Sequenz1")) & @CRLF & _ ; LowByte/HighByte? -> Byte sind gedreht
    Hex(DllStructGetData($struct, "Part1A")) & @CRLF & _
    Hex(DllStructGetData($struct, "Part1B")) & @CRLF & _
    Hex(DllStructGetData($struct, "Address1")) & @CRLF & _ ; Little Endian? -> Reihenfolge rückwärts
    Hex(DllStructGetData($struct, "Sequenz2")) & @CRLF & _
    Hex(DllStructGetData($struct, "Part2A")) & @CRLF & _
    Hex(DllStructGetData($struct, "Part2B")) & @CRLF & _
    Hex(DllStructGetData($struct, "Address2"))

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

    Ausgabe('Struct "' & $name & '" in Hex', $msg)
    EndFunc ;==>StructAusgabeHex

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

    ; Funktion, die einfach eine Ausgabe in die Console macht (mit Trennlinie und Überschrift)
    Func Ausgabe($was = "", $Inhalt = "")
    ; Trennlinie
    ConsoleWrite("_______________________________________________________________________________" & @CRLF)
    ; Was
    If $was <> "" Then ConsoleWrite("---- " & $was & " -----" & @CRLF)
    ; Inhalt
    ConsoleWrite($Inhalt & @CRLF)
    EndFunc ;==>Ausgabe

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

    #EndRegion --- Funktionen ---

    [/autoit]

    Und wenn das so ist, wie das ist, mit welchen Funktionen kann ich am schnellsten den uint und den short "drehen"?

    Besten Dank und weiterhin happy computing!
    R@iner

  • Broadcast Adresse für alle Fälle

    • skyteddy
    • 2. Mai 2009 um 17:35

    Hallo Andy,

    ja, so hatte ich es auch gemacht, ging gestern Abend aber nicht. Keine Ahnung warum. :(

    Heute hab ich es nochmal frisch gemacht, und schon klappt es auf Anhieb. Allerdings habe ich ein Verständnisproblem mit dem Befüllen der Bytes. Wenn Du Dir die Ausgabe meines Tests hier mal anschaust, dann werden die Bytes gedreht und ich weiß nicht wirklich warum. Hast Du ne Ahnung warum das so ist.

    Also speziell meine ich den Unterschied zwischen dem Befüllen einer kompletten Structur in einem String und meiner TestStructur mit 2 einzelnen SetData. Da sind die Bytes gedreht. ?(

    Spoiler anzeigen
    [autoit]


    Opt("MustDeclareVars", 1)

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

    ; Struktur definieren
    Global Const $MyStruct = _ ; 16 Byte in der Summe
    "short Sequenz1;" & _ ; 2 Byte
    "byte Part1A;" & _ ; 1 Byte
    "byte Part1B;" & _ ; 1 Byte
    "uint Address1;" & _ ; 4 Byte
    "short Sequenz2;" & _ ; 2 Byte
    "byte Part2A;" & _ ; 1 Byte
    "byte Part2B;" & _; 1 Byte
    "uint Address2;" ; 4 Byte

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

    ; Angenommene Daten die vom Router zurückkommen
    ; In Hex: 00 01, 1a, 1b, 11 22 33 44, 00 02, 2a, 2b, 55 66 77 88
    Local $BinaryDataFromUDP = "0x00011a1b1122334400022a2b55667788" ; 16 Byte
    Ausgabe("$BinaryDataFromUDP", $BinaryDataFromUDP) ; Testausgabe

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

    #Region --- UDP-Daten ---
    ; Datensatz (als Struktur)
    Global $UDPStruct = DllStructCreate($MyStruct)

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

    ; Datensatz (als Byte-Ansammlung)
    Global $UDPBinStruct = DllStructCreate("byte[" & DllStructGetSize($UDPStruct) & "]", DllStructGetPtr($UDPStruct))

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

    ; Daten setzen
    DllStructSetData($UDPBinStruct, 1, $BinaryDataFromUDP)

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

    ; Ausgabe in Dezimal
    StructAusgabeDec("$UDPStruct", $UDPStruct)
    ; Ausgabe in Hex
    StructAusgabeHex("$UDPStruct", $UDPStruct)
    #EndRegion --- UDP-Daten ---

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

    #Region --- Meine Test-Daten ---
    ; Datensatz (als Struktur)
    Global $TestStruct = DllStructCreate($MyStruct)

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

    ; Testweise etwas setzen
    DllStructSetData($TestStruct, "Sequenz1", "0x0001") ; 2 Byte, wie oben in $BinaryDataFromUDP
    DllStructSetData($TestStruct, "Address1", "0x11223344") ; 4 Byte, wie oben in $BinaryDataFromUDP

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

    ; Datensatz (als Byte-Ansammlung)
    Global $TestBinStruct = DllStructCreate("byte[" & DllStructGetSize($TestStruct) & "]", DllStructGetPtr($TestStruct))
    Ausgabe("$TestBinStruct", DllStructGetData($TestBinStruct, 1)) ; Testausgabe

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

    ; Ausgabe in Dezimal
    StructAusgabeDec("$TestStruct", $TestStruct)
    ; Ausgabe in Hex
    StructAusgabeHex("$TestStruct", $TestStruct)
    #EndRegion --- Meine Test-Daten ---

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

    Ausgabe("", @CRLF & @CRLF)
    Exit

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

    #Region --- Funktionen ---

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

    ; Funktion, die MyStruct in Dec ausgibt
    Func StructAusgabeDec($name, $struct)
    Local $msg = "Struct Size: " & DllStructGetSize($struct) & @CRLF & _
    "Struct pointer: " & DllStructGetPtr($struct) & @CRLF & _
    "Data:" & @CRLF & _
    DllStructGetData($struct, "Sequenz1") & @CRLF & _
    DllStructGetData($struct, "Part1A") & @CRLF & _
    DllStructGetData($struct, "Part1B") & @CRLF & _
    DllStructGetData($struct, "Address1") & @CRLF & _
    DllStructGetData($struct, "Sequenz2") & @CRLF & _
    DllStructGetData($struct, "Part2A") & @CRLF & _
    DllStructGetData($struct, "Part2B") & @CRLF & _
    DllStructGetData($struct, "Address2")

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

    Ausgabe('Struct "' & $name & '" in Dec', $msg)
    EndFunc ;==>StructAusgabeDec

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

    ; Funktion, die MyStruct in Hex ausgibt
    Func StructAusgabeHex($name, $struct)
    Local $msg = "Struct Size: " & DllStructGetSize($struct) & @CRLF & _
    "Struct pointer: " & DllStructGetPtr($struct) & @CRLF & _
    "Data:" & @CRLF & _
    Hex(DllStructGetData($struct, "Sequenz1")) & @CRLF & _ ; LowByte/HighByte? -> Byte sind gedreht
    Hex(DllStructGetData($struct, "Part1A")) & @CRLF & _
    Hex(DllStructGetData($struct, "Part1B")) & @CRLF & _
    Hex(DllStructGetData($struct, "Address1")) & @CRLF & _ ; Little Endian? -> Reihenfolge rückwärts
    Hex(DllStructGetData($struct, "Sequenz2")) & @CRLF & _
    Hex(DllStructGetData($struct, "Part2A")) & @CRLF & _
    Hex(DllStructGetData($struct, "Part2B")) & @CRLF & _
    Hex(DllStructGetData($struct, "Address2"))

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

    Ausgabe('Struct "' & $name & '" in Hex', $msg)
    EndFunc ;==>StructAusgabeHex

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

    ; Funktion, die einfach eine Ausgabe in die Console macht (mit Trennlinie und Überschrift)
    Func Ausgabe($was = "", $Inhalt = "")
    ; Trennlinie
    ConsoleWrite("_______________________________________________________________________________" & @CRLF)
    ; Was
    If $was <> "" Then ConsoleWrite("---- " & $was & " -----" & @CRLF)
    ; Inhalt
    ConsoleWrite($Inhalt & @CRLF)
    EndFunc ;==>Ausgabe

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

    #EndRegion --- Funktionen ---

    [/autoit]

    Danke und ein schönes Wochenende!
    R@iner

    PS: Hätte ich besser einen neuen Thread aufmachen sollen?

  • Broadcast Adresse für alle Fälle

    • skyteddy
    • 1. Mai 2009 um 23:20

    Hallo Andy,

    super, spitze! Du bist ne Wucht! Damit ging es auf Anhieb! Vielen herzlichen Dank dafür!

    Allerdings hab ich jetzt einige Fragen. Ich hab zwar schon in der MSDN-Library nach "Ws2_32.dll" gesucht, finde ~ 3.000 Einträge, aber nicht den, wo sie den Call ansich beschrieben und mit was man was füttern muß. Hast Du für mich bitte, danke den Links zur Hand?

    $AF_INET, $SOCK_DGRAM, $SOL_SOCKET und $SO_BROADCAST sind wahrscheinlich fix und wird vom ws2_32.dll so gebraucht, oder? Ist das Zufall, daß $SOL_SOCKET = 0xFFFF= 65532 und somit gleich deinem verwendeten Port ist? Ich hab nämlich beim Port was anderes benutzt und ging problemlos.

    Der Router stoppt jetzt seinen Bootvorgang und ich bekomme jetzt via UDPRecv 16 Byte vom Router zurück, also z.B. "0x00011a1b1122334400022a2b55667788". Es ist mir klar, daß das Hex ist, daher sind es 34 Zeichen. Abzüglich des "0x" sind es noch 32. Wie bringe ich das jetzt am einfachsten in die nachfolgende Structur?

    Global Const $MyStruct = _ ; 16 Byte in der Summe
    "short Sequenz1;" & _ ; 2 Byte
    "byte Part1A;" & _ ; 1 Byte
    "byte Part1B;" & _ ; 1 Byte
    "uint Address1;" & _ ; 4 Byte
    "short Sequenz2;" & _ ; 2 Byte
    "byte Part2A;" & _ ; 1 Byte
    "byte Part2B;" & _ ; 1 Byte
    "uint Address2;" ; 4 Byte

    Muß ich den "0x00011a1b1122334400022a2b55667788" selber zerlegen und die Structur auffüllen, oder gibt es da nen eleganten Weg?

    Besten Dank und ein schönes Wochenende!
    R@iner

  • Broadcast Adresse für alle Fälle

    • skyteddy
    • 1. Mai 2009 um 08:53

    Da man mir auch im autoitscript-Forum zustimmte, habe ich einen Bug-Report ausgefüllt.

    Happy computing!
    R@iner

  • Broadcast Adresse für alle Fälle

    • skyteddy
    • 27. April 2009 um 01:41

    Hallo Autobert,

    dank Dir für die schnelle Antwort, aber die Broadcast-Adresse ermitteln ist nicht das Thema. Ich hab hier ein Device was nicht reagiert. Der Broadcast (an die "normale" Broadcast-Adresse) wird auch abgeschickt, das sehe ich mit Wireshark, trotzdem reagiert das Device nicht. Benutze ich das Mammut-Programm zu dem Device, was die Funktionalität bietet, dann stoppt das Device.

    Wenn ich jetzt mit Wireshark die Unterschiede anschaue, dann ist als einziges die Broadcast-Adresse unterschiedlich. Der Rest meines Pakets ist identisch, Port, Data. Das paßt alles. Auch vom Timing her ist AutoIt nicht zu langsam. Es stimmt in meinen Augen lediglich die Zieladresse nicht. Ich müßte nen Broadcast an 255.255.255.255 schicken und wie schon gesagt, AutoIt sendet nichts, aber rein garnichts, bringt aber auch keinen Fehler. :(

    Happy computing!
    R@iner

  • Broadcast Adresse für alle Fälle

    • skyteddy
    • 27. April 2009 um 00:41

    Hallo Zusammen,

    ich hab das gleiche Problem wie der User Gespenst. Ein UDPopen an die 255.255.255.255 funktioniert problemlos, es wird kein @error zurückgeliefert. Man bekommt sogar nen gültigen Socket, trotzdem wird nichts gesendet. ich hab mal mit Wireshark mitgetracet, da passiert rein garnichts. :( In meinen Augen ist das ein Bug. Und ja, mein Programm funktioniert, wenn ich die LAN-spezifische Prodcast-Adresse benutze, aber das geht in meinem speziellen Fall nicht. Ich bin auf 255.255.255.255 angewiesen.

    Ist das ein Bug oder kann man das sonst irgendwie lösen?

    Besten Dank und happy computing!
    R@iner

    PS: In dem ersten Link von Crazy-A. steht geschrieben, daß 255.255.255.255 eine gültige Broadcaast-Adresse ist.

    Zitat

    Die spezielle Adresse 255.255.255.255 kann neben der höchsten Geräteadresse im Netz ebenfalls als Broadcastadresse verwendet werden. Dadurch ist das Versenden von Broadcasts ohne Kenntnis weiterer Netzwerkparameter möglich. Dies ist für Protokolle wie BOOTP und DHCP wichtig.

  • DivX Player läßt sich nicht starten

    • skyteddy
    • 9. April 2009 um 17:33

    Dank Dir für Deine Antwort! Aber leider hat das auch nicht das Problem gelöst, aber ich hab jetzt den Fehler gefunden.

    Ich habe SciTE gestartet, dann durch mein Script DivX installieren lassen und im gleichen Script anschliessend den DivX Player gestartet. Das brachte den besagten Fehler. Immer und immer wieder. Als ich dann aber SciTE geschlossen habe und neu gestartet, ging das Starten des DivX Players auf einmal. ?(

    Dann wurde mir schnell klar, woran das liegt. DivX erweitert die Path-Variable um "c:\programme\gemeinsame dateien\divx shared". Lösche ich den Pfad aus der Path-Variable raus, startet der DivX Player auch nicht mehr. Also muß da etwas drin sein, was der DivX Player zum Starten braucht. :) Darum habe ich einfach das WorkingDir durch den Pfad ersetzt:

    ShellExecute($ProgExe, "",@CommonFilesDir & "\DivX Shared" )
    oder auch
    run($ProgExe, @CommonFilesDir & "\DivX Shared" )

    Es funktioniert beides! :)

    Oder gibt es neu andere Möglichkeit, das Environment während der Laufzeit neu einzulesen?
    //Edit: Jaaaaaaa, EnvUpdate :) Mal schauen, ob es funktioniert
    //Edit2: Nein, funktioniert leider nicht.Lt. Help soll es einem logoff/login ähneln, aktualisiert hier anscheinend aber nur den User-Space, nicht aber den System-Space.

    Happy computing und frohe Ostern!
    R@iner

  • DivX Player läßt sich nicht starten

    • skyteddy
    • 9. April 2009 um 13:34

    Hallo Zusammen,

    ich habe ein merkwürdiges Problem und keine Lösung. Egal was ich ausprobiere, es geht nicht. :(

    Ich habe mir heute die neue DivX V7.0.0_10.1.1.33 installiert und damit klappt mein Script nicht mehr. Mit allen vorherigen Versionen war es kein Problem, den DivX Player mit run aus AutoIt zu starten.

    Wenn ich jetzt die aktuelle Version des DivX Players via AutoIt starten will, bekomme ich folgenden Fehler:
    DivX Player.exe - Komponente nicht gefunden
    Die Anwendung konnte nicht gestartet werden, weil qt-dx331.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben

    Die Datei qt-dx331.dll ist definitiv nicht auf dem System. Auch nicht nach einer kompletten De- und Neuinstallation des DivX-Players.

    Komisch aber, daß der DivX Player startet, wenn ich ihn direkt in Windows über Doppelklick auf das ShortLink-Icon starte, oder in einer Batch oder von einer cmd.exe aus. Nur eben nicht über AutoIt. :( Klar kann man jetzt sagen, es ist ein DivX-Fehler, aber warum läßt sich der DivX Player ansonsten starten, nur nicht über AutoIt!? ?(

    Ich habe es mit run, ComSpec, ShellExecute und sogar mit Erzeugung und Starten einer Batch probiert, es klappt einfach nicht. Auch mit und ohne Pfadangabe. Nachfolgend das, was ich schon alles probiert habe.

    Spoiler anzeigen
    Code
    Local $ProgPfad = @ProgramFilesDir & "\DivX\DivX Player" ; Installpath
    	Local $ProgExe = @ProgramFilesDir & "\DivX\DivX Player\DivX Player.exe" ; Installiertes File
    
    
    	Local $DateAndTime = @YEAR & "." & @MON & "." & @MDAY & "." & @HOUR & "." & @MIN & "." & @SEC
    	Local $TempBatFile = @TempDir & "\TempBatFile_" & $DateAndTime & "_.bat"
    
    
    	; ----- Start-Versuche mit AutoIt-Möglichkeiten -----
    	; run($ProgExe, $ProgPfad )
    	; run($ProgExe )
    	; run('"' & $ProgExe & '"', '"' & $ProgPfad  & '"')
    	; ShellExecute($ProgExe )
    	; ShellExecute($ProgExe, "", $ProgPfad )
    	; Run(@ComSpec & " /c " & '$ProgExe', "", @SW_HIDE)
    	; RunWait(@ComSpec & " /c " & $ProgExe, $ProgPfad )
    	; RunWait(@ComSpec & " /c " & '"' & $ProgExe & '"', $ProgPfad )
    
    
    	; ----- Start-Versuche mit AutoIt über Batch -----
    	; Batch 1
    	; FileWriteLine($TempBatFile, "@echo off")
    	; FileWriteLine($TempBatFile, '"' & $ProgExe & '"')
    	; Run($TempBatFile, $ProgPfad)
    	; Batch 2
    	; FileWriteLine($TempBatFile, "@echo off")
    	; FileWriteLine($TempBatFile, 'start " " ' & '"' & $ProgExe & '"')
    	; run($TempBatFile)
    	; Batch 3
    	FileWriteLine($TempBatFile, "@echo off")
    	FileWriteLine($TempBatFile, 'start "ueberschrift" /d"' & $ProgPfad & '" "' & $ProgExe & '"')
    	Run($TempBatFile)
    Alles anzeigen

    Hat jemand ne Lösung, wie ich den DivX Player doch gestartet bekomme?

    Besten Dank im voraus!
    R@iner

  • Position der MuvEnumAddressbar bestimmen

    • skyteddy
    • 5. Februar 2009 um 22:11

    Ich heb mal vorsichtig die Hand und winke. Hat keiner ne Idee?

    Happy programming!
    R@iner

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™