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

  • Neue AutoIT SciTE V14.04.05.11 ab jetzt OHNE Obfuscator! - Alternative verfügbar?

    • skyteddy
    • 7. April 2014 um 14:22

    Hallo Zusammen,

    seit 05.04.2014 gibt es von Jos eine neue SciTE-Version. Leider ab jetzt OHNE Obfuscator, der funktionell ersatzlos lediglich durch den Au3Stripper ersetzt wurde :(

    Aus dem Changelog:
    "Ended all support for Obfuscator and removed from the installation!"

    Jos will das ganze auch nicht diskutieren, wie er mir in einer Email und wohl auch im Forum >>hier<< geschrieben hat. Gut, muss man akzeptieren, ist ne freiwillige Aktion von ihm gewesen.

    Mir ist klar, dass ein/der Obfuscator keinen 100%igen Schutz bietet. Dennoch möchte ich gerne weiterhin meine Programme schützen.

    Auch weiß ich, dass ich den momentanen Obfuscator noch verwenden kann, doch die AutoIt-Entwicklung geht ja weiter und wie z.B. die AutoIT-Version 3.3.11.4 zeigt, gibt es weitere Scipt Breaking Changes, was der Obfuscator sicherlich nicht mehr berücksichtigt.

    Gibt es Alternativen? Wie handhabt Ihr das zukünftig?

    happy computing
    R@iner

  • FTPEx-Problem - wo ist der Fehler?

    • skyteddy
    • 18. November 2013 um 16:37

    Hallo Zusammen,

    ich habe ein Problem mit FTPEx und weiß nicht wo der Fehler liegt. ?(

    Liegt es an meinem Programm, liegt es an der UDF oder wo ist der Hund begraben?

    Ich lese normalerweise rekursiv ein Verzeichnis eines ftp-Sververs aus und schreibe das Ergebnis nach meinen Wünschen in eine Datei. Speziell handelt es sie hier um den ftp-Server ftp://service.avm.de, damit ich Änderungen auf dem Server mitbekomme. Doch seit einigen Wochen funktionierte mein Hauptscript nicht mehr und ich habe jetzt versucht, das Problem zu isolieren. Ich konnte zumindest ermitteln, woran es liegt. Es treten immer dann Fehler auf, wenn das Verzeichnis mit "./" (Punkt Schrägstrich) endet, also zum Beispiel "ftp://service.avm.de/Beta/FRITZ!Box_7340_int./".

    Sobald ich den Inhalt ein mit "./" (Punkt Schrägstrich) endendes Verzeichnis auslese, kommt es danach zu Problemen. Es spielt auch keine Rolle, ob ich den Schrägstrich weglasse.

    Hier mein auf das Wichtigste abgestrippte Testprogramm mit 5 Varianten.
    Nur in Variante 1 wird alles richtig ausgegeben, da eben kein besagtes Verzeichnis mit aufgelistet wird.
    In Variante 2 lese ich als erstes ein solches Verzeichnis aus, wobei da noch der Inhalt richtig ausgegeben wird, aber es kommt nachfolgend dann zu Problemen, sprich es wird ab und an was völlig falsches zurückgeliefert. :(
    Varianten 3 bis 5 sind verschiedene Zusammenstellungen, um ggf. den Fehler einzugrenzen. Liefern alle irgendwo dann auf einmal falsche Ergebnisse zurück.

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Version=Beta
    #AutoIt3Wrapper_UseUpx=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #include <FTPEx.au3>
    #include <Array.au3>

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

    ; ftp-Daten zum Setzen
    #Region VarToSet
    ; ftp-Server
    Global $server = 'service.avm.de'
    Global $username = ''
    Global $userpassword = ''
    #EndRegion VarToSet

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

    ; interne Variablen
    #Region internal vars
    ; MsgBox
    Global Const $Mnormal = 0 + 262144
    Global Const $Merror = 16 + 262144
    Global Const $Mquestion = 32 + 262144
    Global Const $Machtung = 48 + 262144
    Global Const $Mergebnis = 64 + 262144

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

    Global $return
    Global $return

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

    ; ftp-handle
    Global $ftpOpenHdl
    Global $ftpConnect
    #EndRegion internal vars

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

    ; --- Main ---
    #Region main
    ; Opens an FTP session
    $ftpOpenHdl = _FTP_Open('MyFTP Control' & Random(0, 1000, 1), $INTERNET_OPEN_TYPE_DIRECT) ; $INTERNET_OPEN_TYPE_DIRECT -> no proxy
    If @error > 0 Or $ftpOpenHdl == 0 Then
    MsgBox($Merror, "ftp-error", 'ftp-open zu "' & $server & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
    _FTP_Close($ftpOpenHdl)
    Exit
    EndIf

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

    ; Connects to an FTP server
    $ftpConnect = _FTP_Connect($ftpOpenHdl, $server, $username, $userpassword)
    If @error > 0 Or $ftpConnect == 0 Then
    MsgBox($Merror, "ftp-error", 'ftp-connect zu "' & $server & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
    _FTP_Close($ftpOpenHdl)
    Exit
    EndIf
    ConsoleWrite("ftp-connect: " & String($ftpConnect) & @CRLF)

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

    ; -- Ab hier gibt es 4 Testscenarien --
    $return = Number(InputBox("Welche Variante soll getestet werden?", "Varianten 1-5", 1, "", 350, 140))

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

    Switch $return
    Case 1 ; -- Variante 1 ----> alles wird korrekt ausgegeben
    ; Diverse Verzeichnisse ausgeben (ftp://service.avm.de/)
    ftpListDir('/')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta')
    ftpListDir('/Arcor6000')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta')
    ftpListDir('/Arcor6000')
    ftpListDir('/Beta/FRITZ!Box_7320')

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

    Case 2 ; -- Variante 2 ----> liefert falsches Ergebnis
    ; Diverse Verzeichnisse ausgeben (ftp://service.avm.de/)
    ; Als erstes '/Beta/FRITZ!Box_7340_int.' ausgeben
    ftpListDir('/Beta/FRITZ!Box_7340_int.') ; ftp://service.avm.de/Beta/FRITZ!Box_7340_int./ <----- liefert hier richtiges Ergebnis
    ftpListDir('/')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta') ; <----- liefert hier jetzt FALSCHES Ergebnis!
    ftpListDir('/Arcor6000')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta'); <----- liefert hier jetzt FALSCHES Ergebnis!
    ftpListDir('/Arcor6000')
    ftpListDir('/Beta/FRITZ!Box_7320')

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

    Case 3 ; -- Variante 3 ----> liefert falsches Ergebnis
    ; Diverse Verzeichnisse ausgeben (ftp://service.avm.de/)
    ; Ausgabe von '/Beta/FRITZ!Box_7340_int.' nach weiter hinten verfrachtet
    ftpListDir('/')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta')
    ftpListDir('/Arcor6000')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta/FRITZ!Box_7340_int.') ; ftp://service.avm.de/Beta/FRITZ!Box_7340_int./ <----- liefert falsches Ergebnis
    ftpListDir('/Beta')
    ftpListDir('/Arcor6000')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta')
    ftpListDir('/Beta/FRITZ!Box_7320')

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

    Case 4 ; -- Variante 4 ----> liefert falsches Ergebnis
    ; Diverse Verzeichnisse ausgeben (ftp://service.avm.de/)
    ; Als erstes diesmal "/Beta/FRITZ!Box_7390_int." anstatt '/Beta/FRITZ!Box_7340_int.' ausgeben
    ftpListDir("/Beta/FRITZ!Box_7390_int.") ; ftp://service.avm.de/Beta/FRITZ!Box_7390_int./ <----- liefert hier richtiges Ergebnis
    ftpListDir('/')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta') ; <----- liefert hier jetzt FALSCHES Ergebnis!
    ftpListDir('/Arcor6000')
    ftpListDir('/Beta/FRITZ!Box_7320')
    ftpListDir('/Beta'); <----- liefert hier jetzt FALSCHES Ergebnis!
    ftpListDir('/Arcor6000')
    ftpListDir('/Beta/FRITZ!Box_7320')

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

    Case 5 ; -- Variante 5 ----> liefert falsches Ergebnis
    ftpListDir('/Beta/FRITZ!Box_7340_int.') ; ftp://service.avm.de/Beta/FRITZ!Box_7340_int./ <----- liefert hier richtiges Ergebnis
    ftpListDir("/Beta/FRITZ!Box_7390_int.") ; ftp://service.avm.de/Beta/FRITZ!Box_7390_int./ <----- liefert hier jetzt FALSCHES Ergebnis!
    ftpListDir("/Beta/FRITZ!Box_7390_int.") ; ftp://service.avm.de/Beta/FRITZ!Box_7390_int./ <----- liefert hier jetzt FALSCHES Ergebnis!
    ftpListDir('/Beta') ; <----- liefert hier jetzt FALSCHES Ergebnis!

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

    Case Else ; falsche Eingabe
    MsgBox($Merror, "Eingabefehler", 'Es sind nur Zahlen von 1-5 erlaubt und nicht "' & $return & '"')
    EndSwitch

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

    $return = _FTP_Close($ftpOpenHdl)
    If $return <> 1 Then
    MsgBox($Merror, "ftp-error", 'ftp-close von "' & $server & '" fehlgeschlagen!' & @CRLF)
    EndIf
    #EndRegion main

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

    ; --- functions ---
    #Region Functions
    ; Function, die den Inhalt des ftp-Verzeichnises ausgibt (In Console und ArrayDisplay)
    Func ftpListDir($MyFtpDir = '/')
    Local $ftpCurrentDir
    Local $ftpListArray
    Local $temp
    Local $lreturn

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

    ConsoleWrite('ftpListDir von "' & $MyFtpDir & '"' & @CRLF)

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

    ; Get Current Directory on an FTP server
    $ftpCurrentDir = _FTP_DirGetCurrent($ftpConnect)
    If @error > 0 Or $ftpCurrentDir == 0 Then
    MsgBox($Merror, "ftp-error", 'ftp-DirGetCurrent von "' & $server & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
    _FTP_Close($ftpOpenHdl)
    Exit
    EndIf
    ConsoleWrite("ftp-DirGetCurrent: " & String($ftpCurrentDir) & @CRLF)

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

    ; Set Current Directory on an FTP server
    $lreturn = _FTP_DirSetCurrent($ftpConnect, $MyFtpDir)
    If @error > 0 Or $lreturn <> 1 Then
    MsgBox($Merror, "ftp-error", 'ftp-DirSetCurrent von "' & $MyFtpDir & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
    _FTP_Close($ftpOpenHdl)
    Exit
    EndIf
    ConsoleWrite('ftp-DirSetCurrent nach "' & $MyFtpDir & '" gelungen' & @CRLF)

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

    ; Zur Sicherheit nochmal abfragen
    ; Get Current Directory on an FTP server
    $ftpCurrentDir = _FTP_DirGetCurrent($ftpConnect)
    If @error > 0 Or $ftpCurrentDir == 0 Then
    MsgBox($Merror, "ftp-error", 'ftp-DirGetCurrent von "' & $server & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
    _FTP_Close($ftpOpenHdl)
    Exit
    EndIf
    ConsoleWrite("ftp-DirGetCurrent: " & String($ftpCurrentDir) & @CRLF)

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

    ; Get names, sizes, attributes aand times of files/dir of current remote directory
    $ftpListArray = _FTP_ListToArrayEx($ftpConnect, 0) ; 0 = Both Files and Directories, 1 = Directories, 2 = Files.
    If (Not IsArray($ftpListArray)) Or $ftpListArray[0][0] = 0 Then
    MsgBox($Merror, "ftp-error", 'ftp-ListToArrayEx von ' & $ftpCurrentDir & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
    _FTP_Close($ftpOpenHdl)
    Exit
    EndIf
    ConsoleWrite('Einträge: ' & $ftpListArray[0][0] & @CRLF)
    ConsoleWrite(Array2DToString($ftpListArray, "|") & @CRLF)
    _ArrayDisplay($ftpListArray, $server & ' - ' & $ftpCurrentDir)
    EndFunc ;==>ftpListDir

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

    ; QuickHack: 2D-Array in String umwandeln
    Func Array2DToString($2DArryMitZelle0, $delimiter = "|", $davor = " ")
    Local $String

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

    ; ein Array?
    If Not IsArray($2DArryMitZelle0) Then
    ConsoleWrite(" -> kein Array!" & @CRLF)
    Return ""
    EndIf

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

    ; 2D-Array?
    If UBound($2DArryMitZelle0, 0) <> 2 Then
    ConsoleWrite(" -> kein 2D-Array!" & @CRLF)
    Return ""
    EndIf

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

    For $r = 1 To UBound($2DArryMitZelle0, 1) - 1
    ; Vor jede Zeile
    $String &= $davor
    For $c = 0 To UBound($2DArryMitZelle0, 2) - 1
    $String &= $2DArryMitZelle0[$r][$c] & $delimiter
    Next
    ; letzten Delimiter wieder abschneiden
    $String = StringTrimRight($String, StringLen($delimiter))
    $String &= @CRLF
    Next

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

    Return $String
    EndFunc ;==>Array2DToString
    #EndRegion Functions

    [/autoit]

    edit:
    Es spielt auch keine Rolle, ob ich die momentane Final 3.3.8.1 oder die aktuelle Beta 3.3.9.22 verwende.

    Ich weiß einfach nicht, wo der Fehler liegt. Rufe ich die Funktionen falsch auf oder ist da ein Bug in der UDF?

    Besten Dank und weiterhin happy computing
    R@iner

  • FYI: Es gibt ne neue SciTE-Version 14.11.2013

    • skyteddy
    • 16. November 2013 um 19:02

    Hallo Zusammen,

    Jos hat ne neue SciTE-Version rausgebracht. Die History-Seite ist noch nicht aktualisiert, aber man kann die neue SciTE-Version seit vorgestern runterladen:

    "Installer containing SciTE and all configuration files plus utilities.Update History. Definition files included: AutoIt v3.3.8.1 and BETA v3.3.9.22"
    SciTE-Donwload-Seite

    Aus der SciTE-Help:

    11/14/2013
    *** Merged the updates of SciTE v 3.3.6 by Neil Hodgson with our own version of SciTE. (Jos)
    - Added check to avoid double shelling of the script via shortcuts of the tools menu items.
    - Added Properties option to set the default encoding of new files:
    NewFileEncoding=CodePage/UTF8/UTF8BOM/UTF16BE/UTF16LE
    - Fixed issue in AU3 lexer to show the last correctly when the previous line is a commentline, commentblock, Special and Directives.
    *** Updated AutoIt3Wrapper v2.1.3.0 (Jos)
    - Fixed issue where a tempfile was left behind when files was checked by au3check and UTF encoded.
    - Added support for the #PRAGMA statement to avoid any conflicts. Warnings are now displayed in the Console output.
    - Added SciTE version to the displayed info in the Console Output.
    - Added #AutoIt3Wrapper_Res_Remove (wraithdu)
    - Added File compression for Resource Files (wraithdu)
    #AutoIt3Wrapper_Res_File_Add=%in%, 10, UNCOMPRESSED
    #AutoIt3Wrapper_Res_File_Add=%in%, -10, COMPRESSED
    - Updated option to change the TempDir in the INI file. Default changed to @UserProfileDir. (wraithdu)
    - Fixed adding /Beta to the Obfuscator line when using the /Beta on the commandline of Autoit3wrapper.
    - Fixed to ensure UPX is ran when needed.
    - Fixed: Allow | in run_before and Run_After directives.
    *** Updated Tidy v2.4.0.0 (Jos)
    - Added support for 3.3.9.x changes.
    - Changed default EOF setting to add the CRLF. (End_With_NewLine=1)
    - Fixed removal of spaces for new Var/Func notation
    - Fixed crash caused by Function table load.
    *** Updated SciTEConfig v1.6.11.0
    - Updates for Abbrev manager and User Calltip Manager (Melba23)
    *** Updated Obfuscator.exe v1.0.31.0 (Jos)
    - Fixed ensure #pragma statements are not stripped.
    - Fixed Regression internal code cleanup done before. The Obfuscation was broken
    - Fixed #include logic for #Include not first checking the Directory where the file containing the include is located.
    - Added check for max 4100 character record len without causing a crash.
    *** Added support for personal LUA functions. Look at "PersonalTools.lua" in the LUA subdir for details.
    *** Updated SciTEJump to the latest version v2.13.103.227 (guinness)

    happy computing
    R@iner

  • Funktionieren bei Euch noch die User-CallTipps, also Einträge in au3.user.calltips.api?

    • skyteddy
    • 7. August 2012 um 23:32
    Zitat von BugFix

    also eine Interaktion mit Notepad++ kannst du meines Erachtens ausschliessen.
    Es ist zwar ebenso wie SciTE auf Scintilla Basis, aber das allein erlaubt keine unkontrollierte Verbindung zwischen beiden.


    Das ist nur meine Vermutung, ich kann es ja nicht rekonstruieren. Auffällig ist nur, auf dem XP-Rechnern wo ich zwar AutoIt aber kein Notepad++ installiert habe, tritt der Fehler nicht auf. Rein von der Theorie her gebe ich Dir recht.

    Zitat von BugFix

    Die Lokalisierung der User Calltipps im Userprofil ist aber nichts Neues, die ist seit ca. 2 Jahren dort untergebracht. ;)
    Wenn ich am WE zurück bin, schaue ich mal in meinen Aufzeichnungen dazu nach. Irgendwann hatte ich da ein Skript erstellt, das die Calltipps neu im richtigen Pfad anlegt.


    Gewiss nicht, denn ich habe ne Batch, die mir aus all meinen UDFs die Datei zusammenbaut und dann an die richtige Stelle hinkopiert.

    Ich habe gerade nochmal nachgeschaut und in meinen Comment-Zeilen steht, dass ich die Batch erstmals im Februar 2012 wegen dem Pfad angepaßt habe, da ich von Jos die Vorab-Beta-SciTE V3.03 getestet habe.

    Und wenn Du die SciTE-Help aufrufst, steht jetzt noch folgendes auf der Seite zu Scite User CallTips: "( This file is located in Scite Directory \ api \ au3.user.calltips.api for any reason to backup. )"

    happy computing
    R@iner

  • Funktionieren bei Euch noch die User-CallTipps, also Einträge in au3.user.calltips.api?

    • skyteddy
    • 7. August 2012 um 13:19

    Ich benutze Notepad++ auch nicht für AutoIt, aber wie schon gesagt, sporadisch habe ich eben Probleme mit dem SciTE und der fehlenden "Auflösung" der Funktionsparameter.

    Vielleicht tritt es erst auf, wenn ich eine 2. oder 3. Datei in NP++ oder in SciTE offen habe. Ich weiß nur, dass auf einmal die Funktionalität in SciTE nicht mehr vorhanden ist. Wie es genau dazu dann gekommen ist, weiß ich nicht. Sehr oft hilft als Workaround, in SciTE Menü "Tools" -> "User CallTip Entries" aufzurufen. Anschließend funktioniert der SciTE auch wieder "normal".

    happy computing
    R@iner

  • Funktionieren bei Euch noch die User-CallTipps, also Einträge in au3.user.calltips.api?

    • skyteddy
    • 7. August 2012 um 13:08

    Sehr schön :)

    Benutzt Du zufällig den Notepad++? Wenn ja, achte auch mal, ob bei dir Deine Funktionen und auch die UDF-Funktionen immer angezeigt werden, wenn Du den Notepad++ vor dem Start von SciTE gestartet hast, oder auch umgedreht, ob das alles noch funktioniert. Bei mir leider eben nicht zuverlässig, kann es aber nicht 100% reproduzieren, wann der Fehler auftritt.

    happy computing
    R@iner

  • Funktionieren bei Euch noch die User-CallTipps, also Einträge in au3.user.calltips.api?

    • skyteddy
    • 7. August 2012 um 13:02

    Hallo Veronesi,

    also, mit der letzten SciTE-Version (SciTE4AutoIt3_2012.06.10_for_AutoIt_V3.3.9.0+Beta_V3.3.9.4.exe) wurde da ja mal wieder was geändert und die au3.user.calltips.api liegt jetzt in %userprofile% und nicht mehr irgendwo im Programm-Verzeichnis.

    Trotzdem funktioniert es bei mir in XP teilweise gar nicht, manchem teilweise nicht, auch mit regulären "UDF-Funktionen". Ich hab bisher noch nicht herausgefunden, woran das genau liegt, habe aber den Verdacht, wenn ich Notepad++ zwischendrin starte, oder zeitgleich, dass dann in SciTE das ein oder andere nicht mehr funktioniert.

    HTH und weiterhin happy computing
    R@iner

  • Probleme mit UPnP bzw. SSDP-Discover auf Windows 7 mit mehr als einer Netzwerkkarte

    • skyteddy
    • 3. Juni 2012 um 10:32

    Hat niemand eine Idee?

    Besten Dank und viele Grüße
    R@iner

  • Probleme mit UPnP bzw. SSDP-Discover auf Windows 7 mit mehr als einer Netzwerkkarte

    • skyteddy
    • 31. Mai 2012 um 11:59

    Hallo Zusammen,

    ich habe gerade mit Entsetzen festgestellt, dass unter Windows XP auch nur jeweils Antworten von einer Netzwerkkarte gelesen werden. Die Devices, die an der 2. Netzwerkkarte hängen, empfange ich nicht. Wenn ich die "lesen" will, muß ich Netzwerkkarte 1 im Gerätemanager deaktivieren :(

    Mach ich was prinzipiell falsch oder was ist das los?

    Besten Dank und viele Grüße
    R@iner

  • IniWrite

    • skyteddy
    • 30. Mai 2012 um 17:46
    Zitat von m-obi

    Warum sollte ClipPut falsch sein?


    Ein CTRL+C kopiert in der Regel den selektierten Text in die Zwischenablage! Dein Clipput() macht genau das Gegenteil, nämlich schreibt "" in die Zwischenablage und löscht somit den Text in der Zwischenablage.

    Aber ich hab das ganze Vorhaben des $OP eh nicht verstanden :)

    happy computing
    R@iner

  • IniWrite

    • skyteddy
    • 30. Mai 2012 um 13:41
    Zitat von m-obi

    Du meinst sie ;).
    Ich meine Ilse versteht es eher anhand von Scripten.


    Keine Ahnung, ob Ilse männlich, weiblich oder was auch immer ist. Bei Nicks ist das nicht klar ersichtlich.

    So geht es auch, wobei evtl. Dein Clipput falsch sein kann und sein Send(..) richtig.

    [autoit]

    Func _merken()
    Local $i = 1, $sIniFile = @ScriptDir & "\ini\" & GUICtrlRead($cLargeInput) & ".ini", $aIni
    ClipPut()
    $aIni = IniReadSection($sIniFile, "Link")
    If Not @error Then $i = $aIni[0][0] + 1
    IniWrite($sIniFile, "Link", $i, ClipGet())
    EndFunc ;==>_merken

    [/autoit]

    happy computing
    R@iner

  • IniWrite

    • skyteddy
    • 30. Mai 2012 um 12:26

    Da bin ich anderer Meinung, sonst hätte er es bereits nach den ersten Tipps selber lösen können ;)

    happy computing
    R@iner

  • IniWrite

    • skyteddy
    • 30. Mai 2012 um 12:21

    Ich könnte es noch kürzer machen, aber es geht ja darum, dass der User versteht, was passiert. Nichts schlimmeres, als Scripte nicht verstehen zu können...

    happy computing
    R@iner

  • IniWrite

    • skyteddy
    • 30. Mai 2012 um 11:01

    Dann viel Spaß damit und weiterhin happy computing
    R@iner

  • IniWrite

    • skyteddy
    • 30. Mai 2012 um 10:39

    Dann probier es mal so:

    Spoiler anzeigen
    [autoit]

    Func _merken()
    Local $MerkNr
    Local $IniFile = @ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini"
    Local Const $IniSection = "Link"
    Local $SectionContent

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

    Send("^c"); EIntrag für die Zwischenablage
    Sleep(300)

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

    ; MerkNr ermitteln
    If FileExists($IniFile) Then ; Prüft ob INI vorhanden ist!
    ; Section einlesen
    $SectionContent = IniReadSection($IniFile, $IniSection)
    If @error Then
    ; Section nicht lesbar oder nicht vorhanden -> $MerkNr = 1
    $MerkNr = 1
    Else
    ; Davon ausgehend, dass von 1 bis x durchnummeriert ist - > $MerkNr = Anzahl der Array-Einträge
    $MerkNr = $SectionContent[0][0]
    ; Um 1 erhöhen
    $MerkNr += 1
    EndIf
    Else
    ; Ini existiert nicht -> $MerkNr = 1
    $MerkNr = 1
    EndIf

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

    ; Wert rausschreiben
    IniWrite($IniFile, $IniSection, $MerkNr, ClipGet())
    EndFunc ;==>_merken

    [/autoit]

    happy computing
    R@iner

  • IniWrite

    • skyteddy
    • 29. Mai 2012 um 20:04
    Zitat von Ilse

    hm irgendwie etwas verwirrend


    Tut mir leid, ich versteh Dein Geschreibsel und Deine Aufgabenstellung nicht, von daher kann ich Dir nicht helfen. Es muss Dir ein anderer helfen, der Dich versteht.

    Gut wäre es auch, wenn Du Deinen ganzen Code posten würdest, so macht es wenig Sinn.

    happy computing
    R@iner

    PS: Wenn Du die Parameter eines Befehls nicht verstehst, dann klick auf den Befehl, z.B. IniWrite und drücke F1

  • IniWrite

    • skyteddy
    • 29. Mai 2012 um 19:48
    Zitat von Ilse

    Die Frage ist: Wie kann ich bevor geschrieben wird
    den letzen Nr.Wert v.[Link] ermitteln und diesen
    als neuen Startwerst setzen.

    Ja das kann man schon auch machen, in dem man alles einliest und den höchsten Wert ermitteln.

    Alternativ kannst Du es so machen:

    Spoiler anzeigen
    [autoit]

    Func _Merken()
    ; Letzte MerkNr ermitteln
    $MerkNr = IniRead(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Mein Merker", "MerkNr", 0)
    ; MerkNr erhöhen
    $MerkNr += 1
    ; Link rausschreiben
    IniWrite(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Link", $MerkNr, ClipGet())
    ; MerkNr rausschreiben
    IniWrite(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Mein Merker", "MerkNr", $MerkNr)
    EndFunc ;==>_Merken

    [/autoit]

    happy computing
    R@iner

  • IniWrite

    • skyteddy
    • 29. Mai 2012 um 18:44

    Ehrlich gesagt, ich versteht jetzt nur noch Bahnhof. Mußt Du Dir deine $MerkNr merken?

    Wenn ja dann mach doch sowas bei Programmstart- und bei Ende:

    [autoit]

    $MerkNr = IniRead ( "MyProgramm.ini", "Meine Settings", "MerkNr", 0 )
    ...
    ...
    <Dein Programm>
    ...
    ...
    IniWrite( "MyProgramm.ini", "Meine Settings", "MerkNr", $MerkNr )
    exit

    [/autoit]

    happy computing
    R@iner

  • IniWrite

    • skyteddy
    • 29. Mai 2012 um 18:26

    Dann lies halt vorher den aktuellen Wert aus der Ini aus, mit IniRead

    happy computing
    R@iner

  • Probleme mit UPnP bzw. SSDP-Discover auf Windows 7 mit mehr als einer Netzwerkkarte

    • skyteddy
    • 29. Mai 2012 um 17:38

    Hallo Zusammen,

    ich bräuchte Eure Hilfe, da ich nicht weiter komme und vermutlich den Wald vor lauter Bäumen nicht sehe.

    Sinn und Zweck meines Programmes ist es, von allen sich im Netz befindenden Geräten via UPnP (SSDP-Discover) die gesendeten Antworten 15 Sekunden lang zu sammeln. Alle 3 Sekunden sende ich erneut.

    Mein Programm funktioniert unter Windows XP, egal wieviel Netzwerkkarten verbaut sind. Unter Windows 7 nur dann, wenn entweder nur eine Netzwerkkarte verbaut oder aktiv ist. D.h. wenn ich in Windows 7 alle Netzwerkkarten im Gerätemanger deaktiviere (auch die der VMware!), bis auf die eine, funktioniert auch dort das Programm. Sind alle Netzwerkkarten aktiv, funktioniert es nicht. :(

    Jetzt stellt sich mir die Frage, ob ich einen Denk- und somit einen Programmfehler habe, oder ob das evtl. ein Bug in AutoIt ist. Ich hab dazu 2 Funktionen geschrieben.

    Die SSDPdiscover_V1 funktioniert wie eben beschrieben. Da benutze ich für den UDPRecv den Port, der auch für das Senden benutzt wurde.
    In SSDPdiscover_V2 habe ich verschiedene UDPBinds durchprobiert, ob es evtl. daran liegen könnte, kam aber nicht wirklich vorwärts. Evtl. mache ich da auch was falsch! Wenn ihr das testen wollt, müßt ihr den Aufruf auch in Main anpassen.

    Hier mein Programm, ich hängt es als Attachment auch noch hin.

    Spoiler anzeigen
    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=.\SSDPdiscover.exe
    #AutoIt3Wrapper_Compression=4
    #AutoIt3Wrapper_Res_Description=
    #AutoIt3Wrapper_Res_Fileversion=0.0.0.1
    #AutoIt3Wrapper_Res_LegalCopyright=(c) by Rainer Ullrich
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_Res_Field=Dateiname|SSDPdiscover
    #AutoIt3Wrapper_Res_Field=Email|[email='rainer@rainerullrich.de'][/email]
    #AutoIt3Wrapper_Run_After=del ".\SSDPdiscover*.au3.tbl"
    #AutoIt3Wrapper_Run_After=del ".\SSDPdiscover*_Obfuscated.au3"
    #AutoIt3Wrapper_Run_Obfuscator=y
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #Obfuscator_Parameters=/cs=1 /cn=1 /cf=1 /cv=1 /sf=1 /sv=1
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #include <Date.au3>
    #include <Array.au3>

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

    Opt("MustDeclareVars", 1)

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

    ; --- MainVar-Deklaration ---
    #region MainVar-Deklaration
    ; Für SSDPdiscover
    Global $MyCollectedResponses ; Array mit den gesammelten Responses
    Global $MyCollectedIPs ; Array mit den gesammelten IPs
    Global $MyZeitZumSuchen = 15 * 1000 ; Zeit zum Suchen in Ticks
    Global $MySendenIntervall = 3 * 1000; Alle x Ticks wird der ssdp-discover gesendet
    Global $MyResultDatei = ".\ssdp-discover-result.txt"
    Global $MyTemp, $MyError, $MyReturn

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

    ; MsgBox
    Global Const $Mnormal = 0 + 262144
    Global Const $Merror = 16 + 262144
    Global Const $Mquestion = 32 + 262144
    Global Const $Mattention = 48 + 262144
    Global Const $Mresult = 64 + 262144
    #endregion MainVar-Deklaration

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

    ; --- Main ---
    #region Main
    ; -- SSDP Discxover via UPnP --
    $MyReturn = SSDPdiscover_V1($MyCollectedResponses, $MyCollectedIPs, $MyZeitZumSuchen, $MySendenIntervall) ; hier ändern, also ..._V1 oder ..._V2 <-------------
    $MyError = @error
    If $MyError <> 0 Then
    $MyTemp = "SSDPdiscover ist gescheitert!" & @CRLF & @CRLF
    Switch $MyError
    Case 0
    ; nix
    Case 1
    $MyTemp &= "UDPOpen-Fehler"
    Case 2
    $MyTemp &= "UDPSend-Fehler"
    Case 3
    $MyTemp &= "UDPRecv-Fehler"
    Case 4
    $MyTemp &= "UDPBind-Fehler"
    EndSwitch
    MsgBox($Merror, "Fehler:", $MyTemp)
    Exit
    EndIf

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

    ; -- Ergebnisausgabe --
    ; File löschen
    If FileExists($MyResultDatei) Then
    If Not FileDelete($MyResultDatei) Then
    MsgBox($Merror, "Fehler:", 'Die Datei "' & $MyResultDatei & '" konnte nicht gelöscht werden!')
    Exit
    EndIf
    EndIf

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

    ; Responses
    If IsArray($MyCollectedResponses) Then
    ; _ArrayDisplay($MyCollectedResponses, "Gesammelte Responses")
    $MyTemp = ''
    For $e = 1 To $MyCollectedResponses[0]
    $MyTemp &= $MyCollectedResponses[$e] & @CRLF
    Next
    If FileWrite($MyResultDatei, $MyTemp) Then
    ; Quickhack un die Datei zu öffnen
    Run(@ComSpec & ' /c start "" "' & $MyResultDatei & '"', @WorkingDir, @SW_HIDE)
    MsgBox($Mresult, "Ergebnis:", 'Das Ergebnis wurde in die Datei "' & $MyResultDatei & '" geschrieben!')
    Else
    MsgBox($Mresult, "Ergebnis:", 'Das Ergebnis konnte nicht in die Datei "' & $MyResultDatei & '" geschrieben werden!')
    EndIf
    Else
    MsgBox(0, "Ergebnis:", "Es wurden via UPnP keine Responses geliefert!")
    EndIf

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

    ; IP
    If IsArray($MyCollectedIPs) Then
    _ArrayDisplay($MyCollectedIPs, "Gesammelte IPs")
    Else
    MsgBox($Mresult, "Ergebnis:", "Es wurden via UPnP keine Boxen gefunden!")
    EndIf
    #endregion Main

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

    ; --- Funktionsdefinitionen ---
    #region Funktionsdefinitionen
    ; Funktion, die via UPnP einen ssdp-discover durchführt und die Ergebnisse in ein Array schreibt.
    ; Außerdem werden die IP-Adressen der gefundenen Geräte in ein extra Array geschrieben
    ; V1: Receive-Socket = Send-Socket. Funktioniert unter XP immer und in Win 7 nur dann, wenn alle bis auf eine Netzwerkkarte im Gerätemanager deaktiviert ist
    ; Error:
    ; 0 = kein Error
    ; 1 = UDPOpen-Fehler
    ; 2 = UDPSend-Fehler
    ; 3 = UDPRecv-Fehler
    ; 4 = UDPBind-Fehler
    Func SSDPdiscover_V1(ByRef $ResponsesArray, ByRef $IPArray, $TicksToSearch = 10000, $SendintervallInTicks = 1000)

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

    ; --- UPnP-Kommando ---
    Local Const $UPnPcmd = _
    'M-SEARCH * HTTP/1.1' & @CRLF & _
    'ST:upnp:rootdevice' & @CRLF & _
    'MX: 10' & @CRLF & _
    'MAN: "ssdp:discover"' & @CRLF & _
    'HOST: 239.255.255.250:1900' & @CRLF & _
    @CRLF
    Local $UPNPsendSocket, $UPNPreceiveSocket
    Local $SendCounter = 0, $ReceiveCounter = 0
    Local $ReceiveData, $NewIP
    Local $StartTimeoutTimer, $UsedTimeoutTicks ; Timeout-Timer
    Local $StartSendeTimer, $UsedSendeTicks ; Send-Timer
    Local $OldRestSekunden = -99, $RestSekunden
    Local $return = 1, $error = 0

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

    ; Arrays "löschen"
    $ResponsesArray = ""
    $IPArray = ""

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

    ; UPnP-Kommando ausgeben
    ConsoleWrite(@CRLF)
    ConsoleWrite("UPnP-Kommando:" & @CRLF)
    ConsoleWrite($UPnPcmd & @CRLF)

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

    ; UDP starten
    UDPStartup()

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

    ; - Sender -
    ; $array[1] contains the real socket, $array[2] contains the specified IP address and $array[3] contains the port
    $UPNPsendSocket = UDPOpen("239.255.255.250", 1900)
    ConsoleWrite("SendSocket: real socket: " & $UPNPsendSocket[1] & ", IP-address: " & $UPNPsendSocket[2] & ", port: " & $UPNPsendSocket[3] & @CRLF & @CRLF)
    ; _ArrayDisplay($UPNPsendSocket)
    If $UPNPsendSocket[0] == -1 Or $UPNPsendSocket[0] == 0 Then ; Doku etwas schwammig
    ; Error 1
    Return SetError(1, 0, 0)
    EndIf

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

    ; - Empfänger -
    ; Socket muß der gleiche sein, sonst geht es nicht. Allerdings funktioniert es nicht auf Win 7-Rechnern mit mehreren Netzwerkkarten :(
    $UPNPreceiveSocket = $UPNPsendSocket

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

    ; Timer setzen
    $StartTimeoutTimer = TimerInit() ; Timeout-Timer
    $StartSendeTimer = -99 ; Notlösung, kann man schöner programmieren

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

    While 1

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

    ; SenderPause berechnen
    If $StartSendeTimer = -99 Then
    ; Timer wurde bisher noch nicht gesetzt, daher UsedTicks setzen
    $UsedSendeTicks = $SendintervallInTicks + 10
    Else
    ; Berechnen
    $UsedSendeTicks = TimerDiff($StartSendeTimer)
    EndIf

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

    ; Senden
    If $UsedSendeTicks > $SendintervallInTicks Then
    $SendCounter += 1
    ConsoleWrite("UPnP Send Count Nr " & $SendCounter & @CRLF & @CRLF)
    UDPSend($UPNPsendSocket, $UPnPcmd)
    If @error <> 0 Then
    $error = 2
    $return = 0
    ExitLoop
    EndIf
    ; Timer rücksetzen
    $StartSendeTimer = TimerInit()
    EndIf

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

    ; kurze Pause (nach dem Senden)
    Sleep(100)

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

    ; Empfangen
    $ReceiveData = UDPRecv($UPNPreceiveSocket, 1024)
    If @error <> 0 Then
    $error = 3
    $return = 0
    ExitLoop
    EndIf
    If $ReceiveData <> "" Then
    $ReceiveCounter += 1
    ConsoleWrite("-------------------- Received Response " & $ReceiveCounter & ":" & " --------------------" & @CRLF)
    ConsoleWrite($ReceiveData & @CRLF)
    ; Wenn neue Responds, dann hinzugügen
    If AddItemToArray($ResponsesArray, $ReceiveData, 1) > 0 Then
    ConsoleWrite("-> hinzugefügt" & @CRLF & @CRLF)
    Else
    ConsoleWrite("-> bereits vorhanden" & @CRLF & @CRLF)
    EndIf
    ; IP extrahieren und sammeln
    $NewIP = FetchIPfromUPNPdata($ReceiveData)
    If $NewIP <> "" Then AddItemToArray($IPArray, $NewIP, 1)
    EndIf

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

    ; Verbrauchte Zeit ermitteln
    $UsedTimeoutTicks = TimerDiff($StartTimeoutTimer)
    ; Wenn die Zeit verstrichen ist, dann raus
    If $UsedTimeoutTicks >= $TicksToSearch Then
    ExitLoop
    Else
    ; Restsekunden berechnen und als TrayTip ausgeben
    $RestSekunden = Ceiling(($TicksToSearch - $UsedTimeoutTicks) / 1000)
    If $RestSekunden <> $OldRestSekunden Then
    TrayTip("SSPD-Discover", "Devices via UPnP suchen (noch " & $RestSekunden & " Sekunden)... ", 5, 1)
    $OldRestSekunden = $RestSekunden
    EndIf
    EndIf
    WEnd

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

    ; TrayTip schliessen
    TrayTip("", "", 0)

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

    ; Socket schliessen
    UDPCloseSocket($UPNPsendSocket)
    UDPCloseSocket($UPNPreceiveSocket)

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

    ; UDP beenden
    UDPShutdown()

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

    ; Sortieren
    If IsArray($IPArray) Then _ArraySort($IPArray, 0, 1)
    If IsArray($ResponsesArray) Then _ArraySort($ResponsesArray, 0, 1)

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

    ; Wenn Fehler vorhanden, dann Fehler zurückliefern
    If $error > 0 Then
    ; Fehler zurückliefern
    Return SetError($error, 0, $return)
    Else
    ; Normaler Return
    Return $return
    EndIf

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

    EndFunc ;==>SSDPdiscover_V1

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

    ; Funktion, die via UPnP einen ssdp-discover durchführt und die Ergebnisse in ein Array schreibt.
    ; Außerdem werden die IP-Adressen der gefundenen Geräte in ein extra Array geschrieben
    ; V2: Receive-Socket und Send-Socket sind unterschiedlich. Ich hab mal verschiedene Dinge durchprobiert, keine funktioniert.
    ; Error:
    ; 0 = kein Error
    ; 1 = UDPOpen-Fehler
    ; 2 = UDPSend-Fehler
    ; 3 = UDPRecv-Fehler
    ; 4 = UDPBind-Fehler
    Func SSDPdiscover_V2(ByRef $ResponsesArray, ByRef $IPArray, $TicksToSearch = 10000, $SendintervallInTicks = 1000)

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

    ; --- UPnP-Kommando ---
    Local Const $UPnPcmd = _
    'M-SEARCH * HTTP/1.1' & @CRLF & _
    'ST:upnp:rootdevice' & @CRLF & _
    'MX: 10' & @CRLF & _
    'MAN: "ssdp:discover"' & @CRLF & _
    'HOST: 239.255.255.250:1900' & @CRLF & _
    @CRLF
    Local $UPNPsendSocket, $UPNPreceiveSocket
    Local $SendCounter = 0, $ReceiveCounter = 0
    Local $ReceiveData, $NewIP
    Local $StartTimeoutTimer, $UsedTimeoutTicks ; Timeout-Timer
    Local $StartSendeTimer, $UsedSendeTicks ; Send-Timer
    Local $OldRestSekunden = -99, $RestSekunden
    Local $return = 1, $error = 0

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

    ; Arrays "löschen"
    $ResponsesArray = ""
    $IPArray = ""

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

    ; UPnP-Kommando ausgeben
    ConsoleWrite(@CRLF)
    ConsoleWrite("UPnP-Kommando:" & @CRLF)
    ConsoleWrite($UPnPcmd & @CRLF)

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

    ; UDP starten
    UDPStartup()

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

    ; - Sender -
    ; $array[1] contains the real socket, $array[2] contains the specified IP address and $array[3] contains the port
    $UPNPsendSocket = UDPOpen("239.255.255.250", 1900)
    ConsoleWrite("SendSocket: real socket: " & $UPNPsendSocket[1] & ", IP-address: " & $UPNPsendSocket[2] & ", port: " & $UPNPsendSocket[3] & @CRLF & @CRLF)
    ; _ArrayDisplay($UPNPsendSocket)
    If $UPNPsendSocket[0] == -1 Or $UPNPsendSocket[0] == 0 Then ; Doku etwas schwammig
    ; Error 1
    Return SetError(1, 0, 0)
    EndIf

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

    ; - Empfänger -
    If @IPAddress1 <> "0.0.0.0" Then ConsoleWrite(@IPAddress1 & @CRLF)
    If @IPAddress2 <> "0.0.0.0" Then ConsoleWrite(@IPAddress2 & @CRLF)
    If @IPAddress3 <> "0.0.0.0" Then ConsoleWrite(@IPAddress3 & @CRLF)
    If @IPAddress4 <> "0.0.0.0" Then ConsoleWrite(@IPAddress4 & @CRLF)
    ; $UPNPreceiveSocket = UDPBind("127.0.0.1", 1900)
    ; $UPNPreceiveSocket = UDPBind(@IPAddress1, 1900)
    ; $UPNPreceiveSocket = UDPBind("127.0.0.1", $UPNPsendSocket[1])
    ; $UPNPreceiveSocket = UDPBind(@IPAddress1, $UPNPsendSocket[1])
    ; $UPNPreceiveSocket = UDPBind("239.255.255.250", 1900)
    $UPNPreceiveSocket = UDPBind(@IPAddress1, 1900)
    ConsoleWrite("ReceiveSocket: real socket: " & $UPNPreceiveSocket[1] & ", IP-address: " & $UPNPreceiveSocket[2] & ", port: " & $UPNPreceiveSocket[3] & @CRLF & @CRLF)
    ; _ArrayDisplay($UPNPsendSocket)
    If $UPNPreceiveSocket[0] == -1 Or $UPNPreceiveSocket[0] == -0 Then ; Doku etwas schwammig
    ; Error 4
    Return SetError(4, 0, 0)
    EndIf

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

    ; Timer setzen
    $StartTimeoutTimer = TimerInit() ; Timeout-Timer
    $StartSendeTimer = -99 ; Notlösung, kann man schöner programmieren

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

    While 1

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

    ; SenderPause berechnen
    If $StartSendeTimer = -99 Then
    ; Timer wurde bisher noch nicht gesetzt, daher UsedTicks setzen
    $UsedSendeTicks = $SendintervallInTicks + 10
    Else
    ; Berechnen
    $UsedSendeTicks = TimerDiff($StartSendeTimer)
    EndIf

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

    ; Senden
    If $UsedSendeTicks > $SendintervallInTicks Then
    $SendCounter += 1
    ConsoleWrite("UPnP Send Count Nr " & $SendCounter & @CRLF & @CRLF)
    UDPSend($UPNPsendSocket, $UPnPcmd)
    If @error <> 0 Then
    $error = 2
    $return = 0
    ExitLoop
    EndIf
    ; Timer rücksetzen
    $StartSendeTimer = TimerInit()
    EndIf

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

    ; kurze Pause (nach dem Senden)
    Sleep(100)

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

    ; Empfangen
    $ReceiveData = UDPRecv($UPNPreceiveSocket, 1024)
    If @error <> 0 Then
    $error = 3
    $return = 0
    ExitLoop
    EndIf
    If $ReceiveData <> "" Then
    $ReceiveCounter += 1
    ConsoleWrite("-------------------- Received Response " & $ReceiveCounter & ":" & " --------------------" & @CRLF)
    ConsoleWrite($ReceiveData & @CRLF)
    ; Wenn neue Responds, dann hinzugügen
    If AddItemToArray($ResponsesArray, $ReceiveData, 1) > 0 Then
    ConsoleWrite("-> hinzugefügt" & @CRLF & @CRLF)
    Else
    ConsoleWrite("-> bereits vorhanden" & @CRLF & @CRLF)
    EndIf
    ; IP extrahieren und sammeln
    $NewIP = FetchIPfromUPNPdata($ReceiveData)
    If $NewIP <> "" Then AddItemToArray($IPArray, $NewIP, 1)
    EndIf

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

    ; Verbrauchte Zeit ermitteln
    $UsedTimeoutTicks = TimerDiff($StartTimeoutTimer)
    ; Wenn die Zeit verstrichen ist, dann raus
    If $UsedTimeoutTicks >= $TicksToSearch Then
    ExitLoop
    Else
    ; Restsekunden berechnen und als TrayTip ausgeben
    $RestSekunden = Ceiling(($TicksToSearch - $UsedTimeoutTicks) / 1000)
    If $RestSekunden <> $OldRestSekunden Then
    TrayTip("SSPD-Discover", "Devices via UPnP suchen (noch " & $RestSekunden & " Sekunden)... ", 5, 1)
    $OldRestSekunden = $RestSekunden
    EndIf
    EndIf
    WEnd

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

    ; TrayTip schliessen
    TrayTip("", "", 0)

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

    ; Socket schliessen
    UDPCloseSocket($UPNPsendSocket)
    UDPCloseSocket($UPNPreceiveSocket)

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

    ; UDP beenden
    UDPShutdown()

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

    ; Sortieren
    If IsArray($IPArray) Then _ArraySort($IPArray, 0, 1)
    If IsArray($ResponsesArray) Then _ArraySort($ResponsesArray, 0, 1)

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

    ; Wenn Fehler vorhanden, dann Fehler zurückliefern
    If $error > 0 Then
    ; Fehler zurückliefern
    Return SetError($error, 0, $return)
    Else
    ; Normaler Return
    Return $return
    EndIf

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

    EndFunc ;==>SSDPdiscover_V2

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

    ; Funktion, die aus den ReceivedPacket die IP-Adresse extrahiert
    Func FetchIPfromUPNPdata($Data)

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

    #cs Beispiel:

    HTTP/1.1 200 OK
    LOCATION: http://192.168.5.1:49000/igddesc.xml
    SERVER: WLAN_VDSL_Ullrich UPnP/1.0 AVM FRITZ!Box Fon WLAN 7270 54.04.74
    CACHE-CONTROL: max-age=1800
    EXT:
    ST: upnp:rootdevice
    USN: uuid:75802409-bccb-40e7-8e6c-001F3F56E239::upnp:rootdevice
    #ce

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

    ; --- Einfach mit RegExp die IP rausfiltern ---
    ; Local $IP = StringRegExp($Data, "LOCATION: http://\d+\.\d+\.\d+\.\d+:49", 1)
    Local $IP = StringRegExp($Data, "\d+\.\d+\.\d+\.\d+", 1)
    ; _ArrayDisplay($IP)

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

    ; Scheun ob es ein Array ist, wenn nicht raus
    If Not IsArray($IP) Then Return ""

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

    ; Ich bauche erstes Element aus dem RegExp-Ergebnis
    $IP = $IP[0]

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

    ; Überprüfen auf Gültigkeit
    If Not _IsIPv4($IP) Then Return ""

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

    Return $IP

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

    EndFunc ;==>FetchIPfromUPNPdata

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

    ; Funktion, die überprüft, ob es eine gültige IP4-IP ist
    Func _IsIPv4($S_IP)
    If StringRegExp($S_IP, "\A(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])\z") Then Return (1)
    Return (0)
    EndFunc ;==>_IsIPv4

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

    ; Funktion, die ein Item an das Array (mit Zelle) hinzufügt und dabei den Counter in Zelle 0 um eins erhöht
    ; Ist das Array noch leer, wird es angelegt. Es wird der Counter zurückgeliefert
    ; Wenn $OnlyIfNew = 1, dann wird vorher geschaut, ob es schon im Array vorhanden ist
    Func AddItemToArray(ByRef $ArrayMitZelleNull, $value, $OnlyIfNew = 0) ; Fügt zum Array ein Item hinzu und erhöht den Wert in Zelle 0. Ist das Array leer, wird eines erzeugt

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

    ; Schauen, ob es ein Array ist. Wenn nicht, dann wird es angelegt und der Wert hinzugefügt
    If IsArray($ArrayMitZelleNull) Then
    ; es ist ein Array
    ; ggf. schauen, ob es bereits enthalten ist
    If $OnlyIfNew == 1 Then
    ; Raus, wenn es bereist enthalten ist, also größer als 0
    If _ArraySearch($ArrayMitZelleNull, $value, 1) > 0 Then
    Return 0
    EndIf
    EndIf

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

    ; Element hinzufügen
    Local $ret = _ArrayAdd($ArrayMitZelleNull, $value)
    ; wenn ungleich -1 dann den Counter erhöhen
    If $ret <> -1 Then
    ; um 1 erhöhren in Zelle 0
    Local $Count = $ArrayMitZelleNull[0] + 1
    $ArrayMitZelleNull[0] = $Count
    ; Index, also Count zurückliefern
    Return $Count
    Else
    Return -1
    EndIf
    Else
    ; Es ist kein Array, daher erzeugen und Wert hinzufügen
    Dim $ArrayMitZelleNull[2]
    $ArrayMitZelleNull[0] = 1
    $ArrayMitZelleNull[1] = $value
    Return 1
    EndIf

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

    EndFunc ;==>AddItemToArray
    #endregion Funktionsdefinitionen

    [/autoit]

    Ja, ich weiß, es gibt auch eine Methode via Obj, aber die liefert mir nicht die von mir gesuchten "Locations".

    Hat jemand eine Idee, was ich falsch mache?

    Besten Dank und viele Grüße
    R@iner

    Dateien

    SSDPdiscover_V3.au3 16,32 kB – 450 Downloads

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™