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

  • Iphlpapi.dll/GetAdaptersInfo liefert mit 64bit-Compilat bei LeaseObtained u. LeaseExpires immer 0

    • skyteddy
    • 12. April 2011 um 15:22

    Hallo Zusammen,

    in der Vergangenheit habe ich die Infos für die Netzwerkadapter immer mittels WMI und Win32_NetworkAdapterConfiguration ausgelesen, doch bei z.B. mürben Nvidia-Treibern wurde oft bei IP, Subnetmask etc immer "" zurückgeliefert. Daher bin ich auf der Suche nach einer Alternative und bin auf da Script GetAdaptersXML.au3 von ProgAndy gestossen.

    Ich hab es leicht modifiziert und als x32 und x64 compiliert und ausprobiert. Doch leider liefert das x64-Compilat immer 0 bei LeaseObtained und LeaseExpires. Der Rest sieht gut aus.

    Jetzt habe ich ne Nacht darüber geschlafen, aber ich finde heute auch nicht die Ursache dafür. Die Structur sieht sauber aus, der Aufruf auch. Hat jemand ne Idee, was da faul ist?

    Spoiler anzeigen
    C
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_UseX64=y
    #AutoIt3Wrapper_Run_Tidy=y
    #Tidy_Parameters=/sci=9
    #AutoIt3Wrapper_Run_Obfuscator=y
    #Obfuscator_Parameters=/cs=1 /cn=1 /cf=1 /cv=1 /sf=1 /sv=1
    
    
    ; Source von ProgAndy
    ;   http://www.autoitscript.com/forum/topic/95901-get-subnetmask-gateway-dns/page__view__findpost__p__689749
    ;   http://www.autoitscript.com/forum/index.php?app=core&module=attach&section=attach&attach_id=26447
    ;
    ; Modifikationen:
    ;   11.04.2011, skyteddy: - Alle Funktionen nach unten verschoben und in eine Region gepackt
    ;                         - Locals in Main zu Global gemacht
    ;                         - Result wird in Datei geschrieben
    ;                         - Neue Funktion _GetTime
    
    
    #include-once
    #include <date.au3>
    Opt("MustDeclareVars", 1)
    
    
    Global $filename
    If @AutoItX64 Then
    	$filename = "GetAdapterInfos_x64.xml"
    Else
    	$filename = "GetAdapterInfos.xml"
    EndIf
    
    
    Global Const $tagIP_ADDRESS_STRING = "char IPAddress[16];"
    Global Const $tagIP_MASK_STRING = "char IPMask[16];"
    Global Const $tagIP_ADDR_STRING = "ptr Next;" & $tagIP_ADDRESS_STRING & $tagIP_MASK_STRING & "DWORD Context;"
    
    
    Global Const $tagIP_ADAPTER_INFO = "ptr Next; DWORD ComboIndex; char AdapterName[260];char Description[132]; UINT AddressLength; BYTE Address[8]; dword Index; UINT Type;" & _
    		" UINT DhcpEnabled; ptr CurrentIpAddress; ptr IpAddressListNext; char IpAddressListADDRESS[16]; char IpAddressListMASK[16]; DWORD IpAddressListContext; " & _
    		"ptr GatewayListNext; char GatewayListADDRESS[16]; char GatewayListMASK[16]; DWORD GatewayListContext; " & _
    		"ptr DhcpServerNext; char DhcpServerADDRESS[16]; char DhcpServerMASK[16]; DWORD DhcpServerContext; " & _
    		"int HaveWins; " & _
    		"ptr PrimaryWinsServerNext; char PrimaryWinsServerADDRESS[16]; char PrimaryWinsServerMASK[16]; DWORD PrimaryWinsServerContext; " & _
    		"ptr SecondaryWinsServerNext; char SecondaryWinsServerADDRESS[16]; char SecondaryWinsServerMASK[16]; DWORD SecondaryWinsServerContext; " & _
    		"DWORD LeaseObtained; DWORD LeaseExpires;"
    
    
    Global Const $NETWORK_REG_KEY = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\"
    
    
    Global $dll = DllOpen("Iphlpapi.dll")
    Global $ret = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", 0, "dword*", 0)
    
    
    Global $adapterBuffer = DllStructCreate("byte[" & $ret[2] & "]")
    Global $adapterBuffer_pointer = DllStructGetPtr($adapterBuffer)
    Global $return = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", $adapterBuffer_pointer, "dword*", $ret[2])
    Global $adapter = DllStructCreate($tagIP_ADAPTER_INFO, $adapterBuffer_pointer)
    If Not @error Then
    	Global $DisplayName, $ptr, $adapterName, $MediaSubType, $PnpInstanceID
    	Global $XML = '<?xml version="1.0" encoding="UTF-8"?>' & @CRLF & "<ADAPTERS>" & @CRLF & @CRLF
    	Do
    		$XML &= "	<ADAPTER>" & @CRLF
    		$XML &= @TAB & @TAB & _GetXML($adapter, "ComboIndex")
    		$XML &= @TAB & @TAB & _GetXML($adapter, "Description")
    		$XML &= @TAB & @TAB & _GetXML($adapter, "AdapterName")
    		$XML &= @TAB & @TAB & xml_makeNode("Address", _GetMac($adapter))
    		$XML &= @TAB & @TAB & _GetXML($adapter, "Index")
    		$XML &= @TAB & @TAB & _GetXML($adapter, "Type")
    		$XML &= @TAB & @TAB & _GetXML($adapter, "DhcpEnabled")
    		$XML &= _GetAllIPsXML(DllStructGetPtr($adapter, "IpAddressListNext"), "IP", False)
    		$XML &= _GetAllIPsXML(DllStructGetPtr($adapter, "GatewayListNext"), "Gateway")
    		$XML &= _GetFirstIPXML(DllStructGetPtr($adapter, "DhcpServerNext"), "DhcpServer")
    		$XML &= @TAB & @TAB & _GetXML($adapter, "HaveWins")
    		$XML &= _GetFirstIPXML(DllStructGetPtr($adapter, "PrimaryWinsServerNext"), "PrimaryWinsServer")
    		$XML &= _GetFirstIPXML(DllStructGetPtr($adapter, "SecondaryWinsServerNext"), "SecondaryWinsServer")
    		;   $XML &= @TAB & @TAB & _GetXML($adapter, "LeaseObtained") ; liefert bei x64-Compilat immer 0
    		$XML &= @TAB & @TAB & _GetTime($adapter, "LeaseObtained") ; liefert bei x64-Compilat immer 0
    		;  $XML &= @TAB & @TAB & _GetXML($adapter, "LeaseExpires") ; liefert bei x64-Compilat immer 0
    		$XML &= @TAB & @TAB & _GetTime($adapter, "LeaseExpires") ; liefert bei x64-Compilat immer 0
    
    
    		$adapterName = DllStructGetData($adapter, "AdapterName")
    		$DisplayName = RegRead($NETWORK_REG_KEY & $adapterName & "\Connection", "Name")
    		$XML &= @TAB & @TAB & xml_makeNode("DisplayName", $DisplayName)
    		$MediaSubType = RegRead($NETWORK_REG_KEY & $adapterName & "\Connection", "MediaSubType")
    		$XML &= @TAB & @TAB & xml_makeNode("MediaSubType", $MediaSubType)
    		ConsoleWrite("+-> Mediasubtype: ( LAN = 1 oder 10 ?why? ; Network-Bridge = 1(aber auch LAN?why) ; WLAN = 2 ; IEEE1394 = 5 ; Bluetooth = 9 ; )" & @CRLF)
    		$PnpInstanceID = RegRead($NETWORK_REG_KEY & $adapterName & "\Connection", "PnpInstanceID")
    		$XML &= @TAB & @TAB & xml_makeNode("PnpInstanceID", $PnpInstanceID)
    
    
    
    
    		$XML &= "	</ADAPTER>" & @CRLF & @CRLF
    		$ptr = DllStructGetData($adapter, "Next")
    		$adapter = DllStructCreate($tagIP_ADAPTER_INFO, $ptr)
    	Until @error
    	$XML &= "<ADAPTER>" & @CRLF
    EndIf
    ConsoleWrite($XML & @CRLF)
    
    
    ; Altes File löschen
    If FileExists($filename) And Not FileDelete($filename) Then
    	MsgBox(48 + 262144, "Fehler", 'Die Datei "' & $filename & '" konnte nicht gelöscht werden!')
    	Exit
    EndIf
    ; Neue Datei schreiben
    If FileWrite($filename, $XML) Then
    	MsgBox(262144, "Result", 'Das Ergenis wurde in der Datei "' & $filename & '" gespeichert!')
    Else
    	MsgBox(48 + 262144, "Fehler", 'Das Ergbnis konnte NICHT in die Datei "' & $filename & '" gespeichert werden!')
    EndIf
    
    
    $adapterBuffer = ""
    $adapterBuffer_pointer = ""
    DllClose($dll)
    
    
    Exit
    
    
    
    
    
    
    ; ------------------------------------------------------------- Funktionsdefinitionen -------------------------------------------------------------
    #region Funktionsdefinitionen
    
    
    Func _GetAllIPsXML($ptr, $Type, $MAC = True, $Indent = 2)
    	Local $Tab = ""
    	For $i = 1 To $Indent
    		$Tab &= @TAB
    	Next
    	Local $return = $Tab & "<" & StringUpper($Type) & "LIST>" & @CRLF
    	Local $IPArray = _GetAllIps($ptr)
    	For $i = 0 To UBound($IPArray) - 1
    		$return &= $Tab & "	<" & StringUpper($Type) & ">" & @CRLF
    		$return &= $Tab & "		" & xml_makeNode($Type & "_IP", $IPArray[$i][0])
    		$return &= $Tab & "		" & xml_makeNode($Type & "_MASK", $IPArray[$i][1])
    		$return &= $Tab & "		" & xml_makeNode($Type & "_CONTEXT", $IPArray[$i][2])
    		If $MAC Then $return &= $Tab & "		" & xml_makeNode($Type & "_MAC", net_getMACIDFromIP($IPArray[$i][0]))
    		$return &= $Tab & "	</" & StringUpper($Type) & ">" & @CRLF
    	Next
    	$return &= $Tab & "</" & StringUpper($Type) & "LIST>" & @CRLF
    	Return $return
    EndFunc   ;==>_GetAllIPsXML
    
    
    
    
    Func _GetFirstIPXML($ptr, $Type, $MAC = True, $Indent = 2)
    	Local $Tab = ""
    	For $i = 1 To $Indent
    		$Tab &= @TAB
    	Next
    	Local $IPStruct = DllStructCreate($tagIP_ADDR_STRING, $ptr)
    	Local $return = $Tab & "<" & StringUpper($Type) & ">" & @CRLF
    	$return &= $Tab & @TAB & xml_makeNode($Type & "_IP", DllStructGetData($IPStruct, "IPAddress"))
    	$return &= $Tab & @TAB & xml_makeNode($Type & "_MASK", DllStructGetData($IPStruct, "IPMask"))
    	$return &= $Tab & @TAB & xml_makeNode($Type & "_CONTEXT", DllStructGetData($IPStruct, "Context"))
    	If $MAC Then $return &= $Tab & @TAB & xml_makeNode($Type & "_MAC", DllStructGetData($IPStruct, "IPAddress"))
    	$return &= $Tab & "</" & StringUpper($Type) & ">" & @CRLF
    	Return $return
    EndFunc   ;==>_GetFirstIPXML
    
    
    
    
    Func _GetAllIps($ptr)
    	Local $IPStruct, $Index = 0
    	Local $IPArray[1][3]
    	Do
    		ReDim $IPArray[$Index + 1][3]
    		$IPStruct = DllStructCreate($tagIP_ADDR_STRING, $ptr)
    		$IPArray[$Index][0] = DllStructGetData($IPStruct, "IPAddress")
    		$IPArray[$Index][1] = DllStructGetData($IPStruct, "IPMask")
    		$IPArray[$Index][2] = DllStructGetData($IPStruct, "Context")
    		$ptr = DllStructGetData($IPStruct, "Next")
    		$Index += 1
    	Until $ptr = 0
    	Return $IPArray
    EndFunc   ;==>_GetAllIps
    
    
    
    
    Func _GetMac(ByRef $tInfo)
    	Local $BinaryMAC = BinaryMid(DllStructGetData($tInfo, "Address"), 1, DllStructGetData($tInfo, "AddressLength"))
    	Return StringTrimRight(StringRegExpReplace(StringTrimLeft($BinaryMAC, 2), "([[:xdigit:]]{2})", "$1:"), 1)
    EndFunc   ;==>_GetMac
    
    
    
    
    Func _GetTime(ByRef $Struct, $Name)
    	Local $val = DllStructGetData($Struct, $Name)
    	If @error Then Return xml_makeNode($Name, "")
    	Return xml_makeNode($Name, _DateAdd('s', $val, "1970/01/01 00:00:00"))
    EndFunc   ;==>_GetTime
    
    
    
    
    Func net_getMACIDFromIP($ip_addr)
    	Local $MAC_struct = DllStructCreate("byte[6]")
    	Local $MAC_size = DllStructCreate("int")
    	DllStructSetData($MAC_size, 1, 6)
    	Local $rc = DllCall("Ws2_32.dll", "int", "inet_addr", "str", $ip_addr)
    	Local $in_addr = $rc[0]
    	$rc = DllCall("iphlpapi.dll", "int", "SendARP", "int", $in_addr, "int", 0, "ptr", DllStructGetPtr($MAC_struct), "ptr", DllStructGetPtr($MAC_size))
    	If $rc[0] <> 0 Then Return ""
    	Local $str = ""
    	For $i = 1 To 6
    		If $i > 1 Then $str = $str & ":"
    		$str &= Hex(DllStructGetData($MAC_struct, 1, $i), 2)
    	Next
    	Return $str
    EndFunc   ;==>net_getMACIDFromIP
    
    
    
    
    Func xml_encode($val)
    	Return StringReplace(StringReplace(StringReplace($val, "&", "&#x26;"), "<", "&#x3c"), ">", "&#x3e")
    EndFunc   ;==>xml_encode
    
    
    
    
    Func xml_makeNode($tag, $val)
    	If StringLen($val) = 0 Then Return "<" & StringUpper($tag) & "></" & StringUpper($tag) & ">" & @CRLF
    ;~ 	ConsoleWrite($tag & "=" & $val & @CRLF)
    	Return "<" & StringUpper($tag) & ">" & xml_encode($val) & "</" & StringUpper($tag) & ">" & @CRLF
    EndFunc   ;==>xml_makeNode
    
    
    
    
    Func _GetXML(ByRef $Struct, $Name)
    	Local $val = DllStructGetData($Struct, $Name)
    	If @error Then Return xml_makeNode($Name, "")
    	Return xml_makeNode($Name, $val)
    EndFunc   ;==>_GetXML
    
    
    #endregion Funktionsdefinitionen
    Alles anzeigen


    Besten Dank im voraus!
    R@iner

    PS: Ergänzung: Das x86-Compilat liefert die richtigen Werte auf einem x64-OS, z.B. Win 7 Ultimate.

  • Neue AutoIt Version

    • skyteddy
    • 6. April 2011 um 22:17
    Zitat von progandy

    Im Tracker sind schon einige Bugs, die gefixt gehören, z.B. Memory leaks bei Stringarrays in Objekteigenschaften


    Oder das fehlende Manifest bei x64. Mein Bug-Report wurde einfach geschlossen und ist bis heute nicht gefixt. Ich benutze noch die 3.3.5.8, die funktioniert wenigstens.

    Seit heute steht auf der Homepage von http://www.autoitscript.com unten "©1999-2011 AutoIt Consulting Ltd". Da stand bis gestern "Jonathan Bennett". Keine Ahnung ob das was zu sagen hat.

    Happy computing!
    R@iner

  • Funktionsbaum bzw. Callgraph

    • skyteddy
    • 31. März 2011 um 20:04

    Hallo Zusammen,

    also, ich hab mir das jetzt mal näher angeschaut.

    SEuBo
    Dein Programm stürzt in Zeile 21 "$sFileRead = StringRegExpReplace($sFileRead, '(?s)#cs(?:.)+#ce|(?m-s)(?:^;.+|;[^"''\r\n]+)', '')" ab.

    eukalyptus
    Hurra, Dein Programm läuft jetzt durch, nachdem ich Tidy über mein Programm drüber laufen habe lassen.

    Allerdings stimmt mindestens mal nicht die Analyse von "mainscript" nicht. Da fehlt einiges. Kann das sein, dass sich das Programm an Kommentaren stört?
    Denn im Vorspann schreib ich so einiges, für was welche Funktion ist.

    Ich hätte gerne noch die Funktionsliste sortiert und dachte mir, ich füge einfach die Zeile "_ArraySort($aFunc, 0, 1, 0, 1)" vor die Zeile 52 "For $i = 1 To $aFunc[0][0]", um das nach Funktionsnamen zu sortieren, aber das verändert total das Ergebnis :(

    Wie bekomme ich die Liste sortiert?

    Besten Dank und happy computing!
    R@iner

  • Funktionsbaum bzw. Callgraph

    • skyteddy
    • 23. März 2011 um 12:08

    Hallo Ihr fleißigen Helfer,

    ich komme erst nächste Woche dazu, mir das näher anzuschauen.

    Dank Euch schon mal.

    Happy computing!
    R@iner

  • Funktionsbaum bzw. Callgraph

    • skyteddy
    • 21. März 2011 um 08:00

    Hallo Ihr Zwei,

    vielen Dank Euch Zwei für Eure Hilfe!

    SEuBo
    Geht leider immer noch nicht :( Es beendet sich noch viel schneller.

    Code
    >Exit code: -1073741819    Time: 5.953

    eukalyptus
    Bei meinen kleineren Scripten funktioniert Dein Script. Allerdings sehe ich dann als Ergebnis, welche Funktion welche weitere aufruft, nicht aber, der umgedrehte Fall, welche Funktion von welcher aufgerufen wird.

    Mein großes Script kann trotzdem noch nicht damit untersucht werden. Da beendet es sich sehr schnell. Es blitzt kurz das Fenster auf, das war's dann.
    Anfänglich dachte ich, dass es vielleicht an der Main-While-Schleife liegt, aber soweit kommt es garnicht.

    Deinen PreProzessor muss ich mir die Woche noch mal anschauen, da ich ein paar eigene UDFs einbinde, wäre der gewiß hilfreich.

    Besten Dank Euch Zwei und happy computing!
    R@iner

  • Funktionsbaum bzw. Callgraph

    • skyteddy
    • 20. März 2011 um 20:56

    Hallo SEuBo,

    super, vielen Dank für Deine Mühe!

    Vermutlich käme das meinem Wunsch schon nahe, aber Dein Programm zeigt mir nichts an, sondern beendet sich ziemlich schnell, wenn ich mein au3-Script inspizieren lasse. :(

    In der Console steht:

    Code
    >Running:(3.3.6.1):C:\Programme\AutoIt3\autoit3.exe "E:\AutoIT-Programme\WhoCallsWho.au3" 
    !>20:45:03 AutoIT3.exe ended.rc:-1073741819
    >Exit code: -1073741819    Time: 10.381

    Ansonsten kein weitere Meldung oder Fehler.

    Wenn ich Dein Script damit untersuchen lasse, kommt die Gui hoch mit den 2 Tabs.

    Kannst Du mal bitte mehr Debug-Ausgaben einbauen, oder wie können wir den Fehler einkreisen?

    Ja, RegExp kann mächtig sein, wenn man weiß, wie man es anwendet. Ich hab mich damit noch nicht näher beschäftigt, hätte es aber gewiß schon ein paar mal gebrauchen können.

    Dank Dir und happy computing!
    R@iner

    /edit:
    Egal welches ich meiner Scripte damit untersuchen lassen will, es kommt überall der gleiche Exit-Code

  • Funktionsbaum bzw. Callgraph

    • skyteddy
    • 19. März 2011 um 15:40

    Hello again,

    ok, ich muss es nochmal anders erklären, damit mein Anliegen besser verstanden wird.

    Da mein Script mittlerweile exakt 277 Funktionen umfasst (ermittelt mit "type MeinScript.au3 | findstr /B /i /c:Func"), würde ich gerne die ein oder andere Funktion erweitern/vereinfachen/ersetzen.

    Mittlerweile sind es sehr komplexe Funktionen geworden, sodass ich gerne vorher wüßte, in welchen anderen Funktionen die betreffende Funktion aufgerufen wird, damit ich abschätzen kann, an wie vielen Stellen ich ggf. auch noch nachbessern muß.

    Ich brauche dabei keinen Callbaum mit Tiefe, also wie oft welche Funktion aufgerufen wird. Mir reicht, wenn ich weiß, welche Funktion von welcher Funktion ggf aufgerufen werden kann.

    Da meine Script/Programm ne Gui mit einigen Buttons und Menüs hat, müßte ich, wenn ich Dein Beispiel nehme, alle Funktionen, Buttons in allen Möglichkeiten mindestens einmal durchspielen, damit ich ne Aussage bekomme, welche Funktion was aufruft. Das wäre ein großer Aufwand. Lass ich z.B. bei einem Testlauf das Drücken ein oder mehrere Buttons/Menü-Funktionen weg, werden die betreffenden Funktionen nicht aufgerufen und somit auch nicht das "ConsoleWrite("_FunktionXYZ" & @TAB & "Aufgerufen von: " & _GetParentFunktion($iSLN) & @CRLF)" ausgeführt.

    Daher suche ich eher einen "passiven" Ansatz, also daß das au3-Script eingelesen und "analysiert" wird, welche Funktion von welcher Funktion aufgerufen wird oder werden könnte. Super wäre es auch noch, wenn das gleiche mit den globalen Variablen machbar wäre, also welche globale Variable von welcher Funktion benutzt wird.

    Nice to have wäre es dann noch, wenn auch der Hauptteil noch untersucht wird. Denn wenn eine Funktion weder von einer anderen Funktion, noch im Hauptteil aufgerufen wird, ist es schlichtweg eine tote Funktion und kann entfernt werden. Das gleiche gilt für globale Variablen. Ich bin mir zwar noch sicher, dass das in meinem Script noch nicht der Fall ist, aber bei soviel Funktionen verliert man leicht den Überblick.

    Ich hoffe, es ist jetzt verständlicher, oder soll ich es anhand eines Beispielscripts deutlicher machen?

    Und ja, Du hast wahrscheinlich Recht, dass ein Obfuscator einfacher arbeitet, als ich komplizierterweise gedacht habe :)

    Vielen Dank und happy computing!
    R@iner

  • Funktionsbaum bzw. Callgraph

    • skyteddy
    • 19. März 2011 um 13:43

    Hallo SEuBo,

    dank Dir für Deine Antwort, aber das hilft mir bei meinem großen Script leider aus mehreren Gründen nicht weiter, denn

    - ich müßte jede Funktion anpacken (geschätzt derzeit 250 Funktionen ohne includes) und diese um den Parameter LineNumber und den ConsoleWrite inkl._GetParentFunktion zu erweitern
    - bei derzeit 38.681 Zeilen (kein Schreibfehler!) au3-Script (natürlich auch einiges an Kommentaren dabei) wird das sehr lange dauern, denn die Funktion _GetParentFunktion liest bei jedem Aufruf mit FileRead das Script komplett ein
    - komme ich beim Programm-Durchlauf nicht immer an allen Funktionen "vorbei/durch"
    - habe ich teilweise in Kommentaren auch die Funktionsnamen stehen, was evtl. das Such-Ergebnis des StringRegExp in _GetParentFunktion verfälschen könnte

    Ne, es müßte schon ein Programm sein, was mein Script einliest, alle Kommentare rauswirft, alle Funktionsdefinitionen sammelt und dann jede Funktion untersucht, inkl. Hauptteil, welche Funktion von wem ausgerufen wird und dann diese gesammelten Information irgendwie ausgibt oder in eine Datei rausschreibt.

    So ähnlich stell ich mir die Funktion des Obfuscators vor, denn der muss ja auch erst das Script nebst Includes einlesen und untersuchen, dann alle Funktionen und Variablen umbenennen (dazu muss er ja wissen, wer was aufruft) und ein neues obfusciertes au3 draus machen.

    Apropos Obfuscator. Mein obfusciertes Script hat noch 21.628 lines of code.

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

  • Funktionsbaum bzw. Callgraph

    • skyteddy
    • 19. März 2011 um 10:50

    Hallo Zusammen,

    ich hab jetzt die Hilfe und das Forum mit ein paar Schlagworten durchsucht, bin aber nicht fündig geworden.

    Gibt es ein Tool (oder evtl. sogar schon ne Funktion in SciTE) welches mir, egal in welcher Form, auflistet, welche meiner Funktionen, welche Funktion aufruft?
    In erster Linie, welche meiner Funktionen welche meine eigenen Funktionen aufruft. Die AutoIt-eigenen sind nicht zwingend notwendig.

    Gibt es sowas?

    Besten Dank und happy computing!
    R@iner

  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 22. Juni 2010 um 11:41

    Hallo BugFix,

    entweder versteh ich Dich nicht, oder Du mich nicht. :(

    Der WM_NOTIFY bzw. die darin enthaltene $NM_CUSTOMDRAW wird für jedes Item aufgerufen, oder? Das heißt, bei 1.000 Reihen und 10 Spalten wären es 10.000 Aufrufe bis einmal ganz die Tablelle "gezeichnet" wird.

    Was soll das jetzt bringen, wenn ich _GUICtrlListView_BeginUpdate direkt vor dem $NM_CUSTOMDRAW aufrufe und gleich danach _GUICtrlListView_EndUpdate? Dann wird ja sofort danach trotzdem gezeichnet, also auch wieder 10.000 Mal.

    Genau deshalb habe ich die beiden Befehle quasi eine "Stufe" höher angesetzt, und dort benutzt. Aber das bringt nix.

    Ich probier es heute Abend trotzdem mal aus.

    Happy computing!
    R@iner

  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 20. Juni 2010 um 23:08

    Nein, die beiden Funktionen sind leider unwirksam, sobald wm_notify am Arbeiten ist. Schau dir Dein von mir modifizierte Beispiel an:

    ich benutze die beiden Funktionen. Auszug:

    [autoit]

    Func SetOptimalColumnWidth()

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

    _GUICtrlListView_BeginUpdate($ListView1)
    For $c = 1 To $MaxCols
    _GUICtrlListView_SetColumnWidth($ListView1, $c - 1, $LVSCW_AUTOSIZE)
    Next
    _GUICtrlListView_EndUpdate($ListView1)

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

    EndFunc ;==>SetOptimalColumnWidth

    [/autoit]

    Neu gezeichnet wird normalerweise immer erst nach dem GUICtrlListView_EndUpdate($ListView1). Und zwar nur der sichtbare Teil. Da hast Du recht.

    Das funktioniert, wenn nicht die wm_notify im Spiel ist. Ich hab es auch schon mit sleep gebremst um zu sehen, ob wirklich nichts gezeichnet wird. Es wird definitiv erst das Resultat nach GUICtrlListView_EndUpdate($ListView1) gezeichnet. Aber durch wm_notify funktionieren diese beiden Funktionen eben nicht mehr.

    Happy computing!
    R@iner

  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 20. Juni 2010 um 22:45
    Zitat von Pinguin94

    Willst du, dass man die Spalten verbreitern kann, ...


    Ja

    Zitat

    oder willst du, dass die Spalten sich der Länge des Textes anpassen?


    Ja, nachdem die Liste erweitert, ergänzt, Elemente gelöscht oder sonst irgendwie modifiziert wurde.

    Zitat

    Weil wenn eins von den beiden zutrifft, ist es ja egal,dass die Redraw Funktion einsetzt, ...


    Nein ist es nicht! Warum habe ich bereits erklärt.

    Nochmal meine Frage:
    Ist es irgendwie möglich, den Redraw, also die kontinuierliche Aktualisierung der GUI während dem wm_notify irgendwie zu unterbinden? Und wenn ja, wie? Gibt es vergleichbares zu _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate?

    Happy computing!
    R@iner

  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 20. Juni 2010 um 21:18

    Hello again,

    ich will nichts verzögern, ich will es beschleunigen! :)

    Kennst Du die Befehle _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate?

    Um es in wenigen Worten zu erklären:
    Wenn die beiden oberen Befehle nicht benutzt werden, dann wird, sobald irgendeine Veränderung mittels irgendeiner Funktion auf das ListView gemacht wird, sofort in der Gui nachgezeichnet, auch wenn es nicht sichtbar ist, oder auch wenn mehrere Operationen hintereinander gemacht werden. Das kostet unnötig Zeit.

    Machen wir es an einem Beispiel deutlich. Das sichtbare Fenster des Listviews ist 10 cm breit. Ich habe 10 Spalten a 2cm. D.h. die ersten 5 Spalten werden angezeigt. Wir vernachlässigen jetzt mal die Reihen.
    Jetzt will ich aber, dass jede Spalte 4 cm breit wird, also wird die erste Spalte 4 cm breit gemacht, dadurch teilweise neu gepinselt und die Spalte 2 nach rechts verschoben und ebenfalls neu gepinselt usw. bis zur letzten Spalte.
    Dann wird die 2. Spalte 4 cm breit gemacht und wird erneut frisch gepinselt und alle darauf folgenden auch. Und das, bis alle Spalten die Breite von 4 cm haben. D.h. viele Spalten werden (unnötigerweise) mehrfach gepinselt.

    Wenn jetzt aber die "Ausgabe" der Gui unterbunden wird, bis alle Spalten 4 cm breit sind, muss nach der Freigabe zum Repaint nur einmal das Endergebnis gezeichnet werden. Dadurch ist die Gui viel schneller, denn nicht das Verbreitern der Spalten kostet Zeit, sondern das Darstellen am Bildschirm in der Gui und nicht der Update des Speichers.

    Und je nach dem wie groß das ListView ist, kann man einiges an Zeit gewinnen. Und wie Du mit dem wm_notify siehst, ist die Funktion eh nicht besonders schnell und wenn da 10 Spalten verbreitert werden müssen, gehen auf meinem Pentium 4 viele Sekunden (!) verloren, bis alle Spalten die optimale Breite haben.

    Ist es jetzt klarer?

    happy computing!
    R@iner

  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 20. Juni 2010 um 19:28

    Hallo Pinguin94,

    sorry, aber ich verstehe Deine frage nicht. Was meinst Du mit Header fixieren?

    Mein Hauptproblem habe ich in Posting 1 und 6 beschrieben. Ich will in einem ListView filtern und entweder die gefilterte Liste darstellen oder in der Originalliste vor und zurückspringen zu den gefundenen Einträgen. Und das Füllen der ListView geht ja mit _GUICtrlListView_AddArray am schnellsten, allerdings würde ich gerne jede zweite Reihe einfärben, damit die Liste leichter lesbar ist.

    Der wm_notify von BugFix hilft, aber ist nicht so besonders schnell, zumal er anscheinend den Redraw im Fenster sofort macht. Und die Aktualisierung des ListViews kann man normalerweise _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate unterbinden. Das klappt aber irgendwie nicht, wenn der wm_notify verwendet wird.

    Ich hoffe, es ist jetzt klarer.

    Happy computing!
    R@iner

  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 20. Juni 2010 um 18:45

    Hallo BugFix,

    danke für die Bestätigung wegen der Array-Fragen! Dann hab ich ja in Posting 12 ja alles richtig gemacht :)

    Die AutoIt-Doku dazu ist unzureichend bzw. irreführend. Ich bleib daher besser bei deinem _Array2DSearch und werde es mir so modifizieren, dass nur die Items und nicht auch noch die SubItems geliefert werden. Dann hab ich alles, was ich brauche.

    Danke auch für die Lösung mit dem WM_NOTIFY. Eine Frage dazu habe ich noch:
    Da ich den Inhalt des ListViews immer wieder verändere, sollte auch das Redraw gestoppt werden, während ich z.B. die Spaltenbreite einstelle.
    Normalerweise gibt es dazu ja _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate, aber das scheint den WM_NOTIFY nicht wirklich zu interessieren, oder gibt es da auch was dazu?

    Hier dein modifizierter Code, damit sehe ich es zumindest auf meinem alten Rechner deutlich.

    Happy computing!
    R@iner

    Dateien

    farbenspiel.au3 2,59 kB – 343 Downloads
  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 20. Juni 2010 um 15:46

    Hallo BugFix,

    dank Dir für das Beispiel. Es scheint so, als wäre es zusammen kopiert, denn es ist nicht lauffähig. Oder fehlen da neben Windowsconstants.au3 noch andere Includes?

    Kannst Du bitte die offenen Fragen noch zum _ArrayFindAll beantworten bzw. gleich Dein Tutorial umd die 2D-Suche erweitern.
    Ist das so, dass man bei _ArrayFindAll alle SubItems einzeln durchsuchen muss? Und was ist der Vorteil gegenüber _ArraySearch ?

    Besten Dank und nen schönen Sonntag!
    R@iner

  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 20. Juni 2010 um 14:41

    Hallo Paule,

    uiii, cool, merci! Ganz anderer Ansatz. :) Sieht auf den ersten Blick kompliziert aus, ist aber wahrscheinlich um vieles einfacher.

    Das muss ich mir mal in Ruhe zu Gemüte führen.

    Danke nochmal und nen schönen Sonntag!
    R@iner

  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 20. Juni 2010 um 13:49

    Hallo Zusammen,

    ich hab es gelöst, wobei mir nicht ganz klar ist, warum man bei _ArrayFindAll und _ArraySearch selber in einer Schleife alle SubItems durchgehen muss. Ich dachte, das wäre gerade der Vorteil von _ArrayFindAll.

    Entweder hab ich ursprünglich den falschen Parameter benutzt um es in einem Rutsch zu machen, oder es geht einfach nicht, in einem 2D-Array alle Reihen auf einmal rauszusuchen.

    Den Fehler warum _GUICtrlListView_SetItemSelected/_GUICtrlListView_EnsureVisible nicht funktioniert, obwohl das Array definitiv die richtigen Werte enthält, ist mir bis jetzt auch noch nicht klar.

    Als Workaround habe ich ein in meinen Augen überflüssiges _GUICtrlListView_ClickItem eingebaut, aber jetzt geht es wenigstens.

    Anbei der letzte Wurf der funktioniert, wobei die Fragen dennoch offen bleiben.

    Schönen Sonntag!
    R@iner

    /edit:
    Gibt es auch eine Alternative für den reihenweisen Farbwechsel, also die Alternative zu
    GUICtrlSetBkColor($GuiListView, $ColorLVungerade) ; Farbe ungerade Zeilen
    GUICtrlSetBkColor($GuiListView, $GUI_BKCOLOR_LV_ALTERNATE)
    wenn man das ListView mit _GUICtrlListView_AddArray befüllt?

    Dateien

    FilterInListView_V3.au3 31,03 kB – 334 Downloads
  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 19. Juni 2010 um 21:47

    Hallo nochmal,

    ich hab mich jetzt nochmal mit der ListView und den Suchmöglichkeiten nach Items beschäftigt.

    Erstmal habe ich getestet, welche der 3 Methoden am schnellsten ist, um ein ListView zu "befüllen".
    1) mit _GUICtrlListView_AddItem und _GUICtrlListView_AddSubItem => 03s (3337 ticks)
    2) mit GUICtrlCreateListViewItem => 04s (4061 ticks)
    3) Array erzeugen und mit _GUICtrlListView_AddArray => 655 ticks

    Ergebnis: Mit Abstand ist die Methode 3 via Array-Erzeugung und _GUICtrlListView_AddArray am schnellsten.

    Motiviert durch das gute Ergebnis dachte ich mir, dass ich gewiss auch noch Geschwindigkeit beim Suchen in der ListView respektive des Arrays herausholen kann.
    Und da begannen meine Probleme. :(

    Suchmethode A mit _GUICtrlListView_FindInText:
    => Das liefert mir ein Array mit Rows zurück, die ich dann in meiner Funktion zum Vor- und Zurückblättern der gefundenen Reihen einfach durchgehe. Dies funktioniert

    Gut dachte ich mir, das Suchen in Arrays wird gewiss schneller sein und ich habe mich damit versucht:

    Suchmethode B mit _ArrayFindAll:
    => Hier bin ich zu doof um die Reihen zu ermitteln. Mir scheint es so, als sucht der nicht in 2D. Wie muss ich das machen, dass mir alle Reihen geliefert werden?

    Da das nicht funktionierte, probierte ich mein Glück mit _ArraySearch

    Suchmethode C mit _ArraySearch:
    => Liefert mir irgendwas, aber nicht das, was ich brauche. Vermutlich muss ich "per Hand" alle Dimensionen durchgehen um die Reihen zu ermitteln, oder wie geht das?

    Gefrustet von dem Ergebnis, habe ich dann auf _Array2DSearch zurückgegriffen

    Suchmethode D mit _Array2DSearch:
    => Liefert mir zwar zuviel Ergebnisse, also Reihe und Spalte, aber daraus kann ich die Reihen rausfiltern.
    Nur jetzt habe ich ein neues Problem. Das Array mit den gefundenen Rows stimmt, aber wenn ich diese Methode verwende funktioniert mein Umblättern in der Funktion "JumpToFoundedItem()" nicht mehr, obwohl das Array absolut identisch ist mit dem aus der Suchmethode A. Es scheint so, als würde _GUICtrlListView_SetItemSelected und _GUICtrlListView_EnsureVisible nicht mehr funktionieren :(

    Ich finde einfach die Fehler nicht. :-((

    In Zeile 231 - 235 kann man die Suchmethode einstellen. Entweder 1 oder mehrere. Das Ergebnis der letzten Methode wird halt genommen.

    Kurzzusammenfassung:
    - Wenn ich nur Methode 1 nehme, funktioniert es
    - Wenn ich nur Methode 4 nehme, die eigentlich das gleiche Ergebnis liefert wie Methode 1, funktioniert das Vor- und zurückblättern nicht. Warum?
    - Methode 2 und 3 liefern schon gleich unbrauchbare Reihenangaben. Wie muss ich das richtig machen?

    Ich hoffe der Code ist lesbar.

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

    Dateien

    FilterInListView_V2.au3 29,45 kB – 386 Downloads
  • ListView und Filter, nur wie am besten?

    • skyteddy
    • 17. Juni 2010 um 19:47

    Hello again,

    ich gestell mich gerade recht blöd mit _GUICtrlListView_SetItemImage. :(

    Da könnte ich am Anfang der Reihe evtl nen Pfeil setzen. Aber wie lösche ich den wieder?

    Ich muss wohl zuerst ne Image-Liste mit _GUIImageList_Create erzeugen. Da würde ich gerne den Pfeil hinzufügen.
    Vermutlich mit _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 137)

    Nur sobald ich die Liste erzeuge, haben automatisch alle Reihen den Pfeil, auch ohne dass ich den explizit den Reihen gesetzt habe :(

    /edit:
    Problem mit der Image-Liste gelöst. In der Liste habe ich nun 2 Elemente. Element 1 ist ein weisses Feld und das zweite Element ist der Pfeil.

    Gruß
    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™