Neue Version und somit erstes Release ist online:
- mittels ANSI Codierung werden nun deutsche Umlaute unterstützt (@tigerpapers)
- es werden alle Grafikformate die GDI+ anbietet nun eingebettet (derzeit ohne Alpha-Kanal)
- kleinere Fehler behoben
Neue Version und somit erstes Release ist online:
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:
#include <GUIConstants.au3>
#include <WinAPISysWin.au3>
GuiCreate("Catch the X Click", 300, 100)
GUISetIcon("C:\Windows\System32\user32.dll", -2)
GUISetState()
$hHandle = WinGetHandle("Catch the X Click") ; <- Hier den Titel des Windowsfenster eintragen
RemoveButtons($hHandle)
DisableCloseButton($hHandle)
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
WEnd
Func DisableCloseButton($hWindow)
Local $aSysMenu = DllCall("User32.dll", "hwnd", "GetSystemMenu", "hwnd", $hWindow, "int", 0)
DllCall("User32.dll", "int", "RemoveMenu", "hwnd", $aSysMenu[0], "int", 0xF060 , "int", 0)
DllCall("User32.dll", "int", "DrawMenuBar", "hwnd", $hWindow)
EndFunc
Func RemoveButtons($hWindow)
Local $iStyle = _WinAPI_GetWindowLong($hWindow, $GWL_STYLE)
_WinAPI_SetWindowLong($hWindow, $GWL_STYLE, BitAND($iStyle, BitNOT($WS_MINIMIZEBOX), BitNOT($WS_MAXIMIZEBOX)))
EndFunc
Alles anzeigen
Dann sieht es ganz danach aus, dass Dein Username nichts mit Deinen AutoIt-Kenntnissen zu tun hat.
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
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?
Nur AutoIt-Code?
Das Scripting Dictionary kommt zum Einsatz, wäre sicherlich auch mit verschachtelten Arrays möglich, wird aber schnell unübersichtlich. Ansonsten ja, keine Includes und keine DllCalls.
Ich mache das ganze mal noch hübsch und setze Kommentare.
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.
Den Ansatz von Moombas finde ich gut, eventuell wäre auch AuPDF eine mögliche Lösung: AuPDF 0.13. Ansonsten sollte es auch externe Software geben, die man gut ansteuern kann.
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...
#include <GUIConstantsEX.au3>
#include <EditConstants.au3>
$hGui = GUICreate("", 500, 500)
$cInput = GUICtrlCreateInput("", 10, 10, 200, 20)
GUICtrlSendMsg($cInput, $EM_SETCUEBANNER, False, "Keys to press (optional)")
$cButton = GUICtrlCreateButton("Test", 10, 100, 80, 30)
GUICtrlSetState($cButton, $GUI_FOCUS)
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Alles anzeigen
Quelle: https://www.autoitscript.com/forum/topic/16…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
Meines Erachtens ist in Zeile 1184 der MPDF-UDF ein Fehler enthalten, habe es mal abgeändert und angehängt. Geht es damit bei dir?
Edit: falsche Zeile angegeben
Riesen Dank!
Das "moderne" XBOX-Solitaire ist nicht zu gebrauchen... Falls du Zeit hast, Bedarf für weiteres ist da
Werde immer wieder nach den XP-Spielen gefragt.
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
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")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]$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
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]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 & "'")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]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:
[autoit]Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
[/autoit][autoit][/autoit][autoit]; ##############
; 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.
Ja, du kannst dann komplett auf die Case verzichten. Schau dir mal das Beispiel an:
GUICtrlSetOnEvent
Jedem Button wird eine Funktion zugeordnet. (Die Funktionen hast du ja schon.)
In die Schleife mit dem Sleep schreibst du dein Pingaufruf.
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