Beiträge von Ahnungslos

    Wenn ich die Datei als UTF8_NOBOM einlese und die komprimierte Datei als Binary speichere, danach wieder als Binary einlese und mit dem Original vergleiche, dann stimmen die Daten nicht mehr, weil jetzt ANSI.

    Beim Einlesen der Daten mit angegebenem Encoding UTF8_NOBOM, sollte AutoIt es intern in UCS2 umwandeln. Letzten Endes ist die Codierung ja aber egal, es muss nach dem Dekomprimieren nur das gleiche rauskommen, wie die Daten zuvor waren...


    Neuster Stand mit Prekompressor:

    ============================================================

    Result for "Ahnungslos"

    ============================================================

    Decompressed = Original: True

    Length Original: 6033

    Length compressed: 3236

    Length decompressed: 6033

    Compress-Ratio: 46.362 %

    Time compressed: 4420 ms

    Time decompressed: 258 ms

    ============================================================

    Wenn du den Schließen-Button nicht entfernst, sondern deaktivierst, dann bleibt auch das Icon erhalten:


    Dann sieht es ganz danach aus, dass Dein Username nichts mit Deinen AutoIt-Kenntnissen zu tun hat. ;):thumbup:

    Bei AutoIt passt der Name schon ganz gut, bin momentan eher in Java unterwegs...

    Bei der Länge von 3600 tippe ich mal auf einen statischen Huffman encoder, da kommen bei mir ähnliche Werte raus :thumbup:

    Genau, habe mir den groben Ablauf von Huffman hier angeschaut und versucht umzusetzen. Neben den komprimierten Daten übergebe ich noch das Wörterbuch. Der Decoder erstellt daraus erneut den Baum um die Bits wieder zu entpacken. Das Wörterbuch ist in diesem Beispiel 192 Bytes groß, würde aber noch kleiner gehen.


    Ich beschäftige mich erst seit Dienstag mit dem Thema, daher mal eine doofe Frage. Hat der adaptive Huffman Encoder neben einer schnelleren Laufzeit (nur ein Durchgang) noch weitere Vorteile? Der statische sollte ja eine bessere Komprimierung erreichen, oder bin ich falsch?

    Von WinRAR noch Welten entfernt, aber ansonsten gefallen mir die Werte schon ganz gut:

    ============================================================

    Result for "Ahnungslos"

    ============================================================

    Decompressed = Original: True

    Length Original: 6033

    Length compressed: 3616

    Length decompressed: 6033

    Compress-Ratio: 40.063 %

    Time compressed: 189 ms

    Time decompressed: 265 ms

    ============================================================

    Schönes Thema.


    Oscar könntest du bei der Prüfroutine eine Abfrage einbauen, ob die Daten binär sind? StringLen wandelt die Binärdaten in Hex und gibt dadurch die doppelte Länge zurück.

    Code
    Global $iCompressedLen = IsBinary($vCompressed) ? BinaryLen($vCompressed) : StringLen($vCompressed)

    Bei einem mehrzeiligen Control wie einem Edit funktioniert mein Vorschlag leider nicht...


    An sich müsste dein Code eigentlich laufen. Eventuell sind $start_char oder $end_char falsch? Ohne ein minimales lauffähiges Script aber schwer zu sagen.


    Einfacher wäre ein Label über oder neben deinem Edit.

    Klingt nach Cuebanner...


    Quelle: https://www.autoitscript.com/f…ndComment&comment=1226083 (von Melba23)

    Ich würde von der Netzwerkanmeldung absehen, vor allem wenn du dafür Zugangsdaten hinterlegen müsstest. Da du deine selbstgeschrieben EXE eh mit Opsi verteilst, könntest du auch die Installationsdatei mittels FileInstall an deine EXE anhängen. Die Datei dann einfach ins temporäre Verzeichnis entpacken und von dort aus starten. Im Anschluss das Löschen der Installationsdatei nicht vergessen ;)


    PS: viele Installationsroutinen bieten einen silent Parameter und müssen dann nicht "ferngesteuert" werden

    In deinem ListView steht an erster Stelle doch die ID...


    Markierte Zeile auslesen, ID von Rest trennen (z.B. StringSplit, StringLeft + StringInStr, ...) und den Datensatz mit der ID löschen.


    Hoffe ich habe dich richtig verstanden 8|

    Um Quelltext formatiert ins Forum zu stellen benötigst du den BBCode autoit, also einfach dein Quelltext in [autoit]dein Code[/autoit] stellen.


    Zum eigentlichen Thema:
    GetSecurityDescriptor erzeugt ein Objekt vom Typ SecurityDescriptor und kein Array, daher kannst du mit der For-Schleife nicht darauf zugreifen. Wie der Aufruf richtig aussehen muss, kann ich dir leider nicht sagen. Was für Daten möchtest du denn genau ermitteln?


    Edit:
    Beim quälen der MSDN noch etwas gefunden ;)
    Die gesuchten Informationen stehen nicht im SecurityDescriptor sondern direkt in Win32_LogicalFileSecuritySetting.




    ;Autoitscript



    Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")



    $wbemFlagReturnImmediately = 0x10
    Local $File_Pfad = @WindowsDir & "\hh.exe" ; Nur zum Test, nur Lesezugriff



    ; impersonationLevel = impersonate ist bevorzugte Standardvorgabe MS
    Local $Obj_WMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & @ComputerName & "\root\cimv2")



    ReadFileOwner_Single($File_Pfad) ; TEST ein Wert auslesen
    ReadFileOwner_Alles($File_Pfad) ; TEST alles auslesen was das Objekt hergibt



    Func ReadFileOwner_Single($Obj_CheckFile)
    Dim $Obj_Owner
    $Obj_Owner_of_File = $Obj_WMIService.Get("Win32_LogicalFileSecuritySetting='" & $Obj_CheckFile & "'")
    $intRetVal = $Obj_Owner_of_File.GetSecurityDescriptor($Obj_Owner)



    If (IsObj($Obj_WMIService)) And (Not @error) Then ; Ist das Objekt $Obj_WMIService ein bekannetes Objekt
    MsgBox(0, "ReadFileOwner", "Owner: " & $Obj_Owner.Owner.Domain & '\' & $Obj_Owner.Owner.Name)
    Else
    MsgBox(0, "WMI Output", "Keine WMI Objects gefunden: " & "Win32_LogicalFileSecuritySetting")
    EndIf



    EndFunc ;==>ReadFileOwner_Single




    Func ReadFileOwner_Alles($Obj_CheckFile)
    Local $a_Text = ""
    Local $Obj_Properties = ""
    Dim $Obj_SecureRead



    $Obj_Owner_of_File = $Obj_WMIService.Get("Win32_LogicalFileSecuritySetting='" & $Obj_CheckFile & "'")



    If (IsObj($Obj_WMIService)) And (Not @error) Then ; Ist das Objekt $Obj_WMIService ein bekannetes Objekt
    ConsoleWrite("Func ReadFileOwner_Alles nach IsObj Abfrage" & @CRLF)



    $a_Text &= 'Description: ' & $Obj_Owner_of_File.Description & @CRLF
    $a_Text &= 'Caption: ' & $Obj_Owner_of_File.Caption & @CRLF
    $a_Text &= 'OwnerPermissions: ' & $Obj_Owner_of_File.OwnerPermissions & @CRLF
    $a_Text &= 'ControlFlags ' & $Obj_Owner_of_File.ControlFlags & @CRLF
    $a_Text &= 'Path: ' & $Obj_Owner_of_File.Path & @CRLF
    $a_Text &= 'SettingID: ' & $Obj_Owner_of_File.SettingID & @CRLF



    MsgBox(0, "TEST Komplett", $a_Text)
    EndIf
    EndFunc ;==>ReadFileOwner_Alles



    ; User's COM error function. Will be called if COM error occurs
    Func _ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
    @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
    @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
    @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
    @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
    @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
    @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
    @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
    @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
    @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
    EndFunc ;==>_ErrFunc

    Um Com-Fehler abzufangen benötigst du noch eine spezielle Funktion, füge mal folgenden Code in dein Script ein:

    Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")


    ; ##############
    ; Hier dein Code
    ; ##############


    ; User's COM error function. Will be called if COM error occurs
    Func _ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
    @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
    @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
    @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
    @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
    @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
    @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
    @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
    @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
    @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
    EndFunc ;==>_ErrFunc


    Dann siehst du, das deine For-Schleife einen Error wirft.

    Also ohne dein Script getestet zu haben:


    a) Die GuiGetMessage-Schleife sollte immer schnellst möglich ablaufen. Das tut sie durch den Aufruf von _Ping() leider nicht. Schau dir mal den OnEventMode an. Da hast du dann nur noch das Switch mit dem Ping() Aufruf in der Schleife und kannst dort ein kleines Sleep() einfügen.


    b) In der Funktion Ping() haben die Global nichts zu suchen. Du definierst die Variablen korrekt am Anfang des Scriptes und solltest sie dann nur noch befüllen. Ein erneutes anlegen ist hier unnötig.


    c) Du solltest die ganze If Abfragen mit in die Ping Funktion schieben, so werden sie nicht bei jedem Schleifendurchgang abgefragt, sondern nur bei Änderung. Und bitte keine MessageBox in die Message-Schleife ;)