AVI Index in Shell32.dll

  • Hallo zusammen!

    In der Hilfe hat es ein wunderschönes Beispiel, wie man aus der Shell32.dll eine AVI Animation darstellen kann:

    [autoit]

    GUICtrlCreateAvi(...)

    [/autoit]

    Leider finde ich keine Liste für Windows 7 an welchen Indizes die verschiedenen Animationen abgelegt sind.
    Der Index 165 steht bereits in der Hilfe, aber was für Indizes gibt es noch?

    Oder gibt es ggfs. noch andere dlls mit nützlichen Animationen?

    Danke !!
    Veronesi

    Einmal editiert, zuletzt von veronesi (28. Januar 2011 um 08:14)

  • Es scheint so, als habe Microsoft sämtliche Animationen (ausser der 165) aus der Shell32.dll entfernt.
    In Windows 7 wird das nun offensichtlich anderst gelöst! Doch wie?

    Grundsätzlich möchte ich zwei Dinge:
    - Eine Funktion mit welcher ich Dateien kopieren kann, aber der "normale" Kopieren Dialog von Windows dabei eingeblendet wird.
    - Die erwähnte Animation auch für andere Dinge (interner Fortschrittsbalken) verwenden.

    Hat jemand eine Idee, wie ich so etwas (auf einfache Art) realisieren könnte? (Mindestens der 1. Punkt wäre sehr interessant)
    Aber so, dass ich den Code auch verstehen kann. (Bin leider kein Programmierer :( )

    Danke!
    Veronesi

  • Hallo,

    zu 1.): hast Du das mal ausprobiert? Ich habe allerdings keine Ahnung, wie das unter Win7 aussieht.

  • Hallo Grossvater,

    ich habe soeben Dein Script unter WIN7 x64 getestet.
    Zuerst dachte ich, dass nichts passiert, weil die 470MB Datei innerhalb von 1.5 Sekunden kopiert wurde. (Habe hier ein RAID 10 mit SSD!)

    Danach habe ich mal eine grössere Datei probiert (2.8GB) und siehe da: Es funktioniert einwandfrei. Genau das was ich wollte.

    Nur eines noch: Ich verstehe den Code ÜBERHAUPT nicht. Trotzdem vielen Dank. Aber kann ich mich da (ohne dass ich ein Programmierer bin) einarbeiten, oder gibt es eine einfachere Lösung?

    Danke!
    Veronesi

  • Hallo Veronesi,

    als "Nichtprogrammierer" ist es wahrscheinlich schwer, den Inhalt der Funktion zu verstehen. Letztlich werden innerhalb der Funktion SHFileOperation() aber nur die übergebenen Parameter in ein passendes Format umgesetzt. Für einen "Mehranwender" ist es deshalb meiner Meinung nach interessanter zu verstehen, wie die Parameter aufgebaut werden müssen. Wenn Du damit Schwierigkeiten hast, kann ich gern versuchen, das im Posting etwas detaillierter zu beschreiben.

  • Hallo Grossvater,

    vielen Dank! Ich denke, für die Zwecke, für welche ich diese Funktion benötige, reicht mein Wissen aus.
    Allerdings überlege ich mir noch, ob ich die Funktion wirklich so einsetzen möchte. Denn wenn mal ein Fehler oder komische Effekte auftauchen, weiss ich nicht recht, wo ich suchen soll.

    Und das ist dann bestimmt in einem riesigen Script, und taucht vermutlich nur sporadisch auf, so dass ich den Fehler nie finden werde.
    Deshalb verstehe ich gerne die Funktionen, welche ich einsetze.

    Trotzdem vielen Dank für Deine Bemühungen. Vielleicht verwende ich es ja doch, dann aber mit Quellenangaben.

    Gruss, Veronesi

  • Hallo Veronesi,

    ich habe Dich vielleicht falsch verstanden. Hilft Dir das weiter?

    Spoiler anzeigen
    [autoit]

    Func _SHFileOperation($wFunc, $sFrom, $sTo = "", $wFlags = 0x0, $hWnd = 0, $sTitle = "")
    ; http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
    ; Die Struktur SHFILEOPTSTRUCT (vgl. Link in Vorzeile) wird erstellt.
    Local $tSHFILEOPSTRUCT = DllStructCreate("HWND hWnd;UINT wFunc;Ptr pFrom;Ptr pTo;WORD fFlags;BOOL fAborted;Ptr;Ptr pTitle")
    ; Wir holen uns das aktuell eingestellte Listentrennzeichen (Standard: |), dieses Zeichen wird als Trennzeichen zwischen
    ; mehreren Namen in $sFrom bzw. $sTo erwartet.
    Local $Sep = Opt("GUIDataSeparatorChar")
    ; Locale Variablen werden auf Grundstellung gesetzt
    Local $iFrom = 0, $iTo = 0, $pTo = 0, $pTitle = 0
    ; Evtl. am Ende von $sFrom stehende Trennzeichen werden entfernt.
    While StringRight($sFrom, 1) = $Sep
    StringTrimRight($sFrom, 1)
    WEnd
    ; Evtl. am Ende von $sTo stehende Trennzeichen werden entfernt.
    While StringRight($sTo, 1) = $Sep
    StringTrimRight($sTo, 1)
    WEnd
    ; An das Ende von $sFrom werden zwei Trennzeichen angehängt, dann werden alle in $sFrom enthaltenen Trennzeichen
    ; durch binäre Nullen ersetzt, weil die Funktion SHFileOperation einzelne binäre Nullen als Trenner zwischen
    ; mehreren Namen und zumindest zwei aufeinanderfolgende binäre Nullen als Merkmal für das Ende der Namen erwartet.
    $sFrom = StringReplace($sFrom & $Sep & $Sep, $Sep, Chr(0))
    ; Die Anzahl der ersetzten Trennzeichen wird in $iFrom abgelegt
    $iFrom = @extended
    ; Für die Übergabe der Werte aus $sFrom wird eine UNICODE-String-Struktur in der Länge von $sFrom angelegt.
    ; Die Anweisung StringLen() zählt netterweise die binären Nullen mit.
    Local $tFrom = DllStructCreate("WChar[" & StringLen($sFrom) & "]")
    ; Die UNICODE-String-Struktur wird mit dem Inhalt von $sFrom gefüllt und dabei ggf. automatisch konvertiert.
    DllStructSetData($tFrom, 1, $sFrom)
    ; Ein Pointer auf die (Zeiger auf die Adresse der) UNICODE-String-Struktur wird in $pFrom abgelegt.
    Local $pFrom = DllStructGetPtr($tFrom)
    ; Wenn $sTo nicht leer ist, wiederholen wir die Konvertierungsschritte von $sFrom für $sTo
    If $sTo Then
    $sTo = StringReplace($sTo & $Sep & $Sep, $Sep, Chr(0))
    $iTo = @extended
    Local $tTo = DllStructCreate("WChar[" & StringLen($sTo) & "]")
    DllStructSetData($tTo, 1, $sTo)
    $pTo = DllStructGetPtr($tTo)
    EndIf
    ; Wenn in $sFrom und in $sTo mehr als zwei Trennzeichen ersetzt wurden und die Anzahl der Ersetzungen gleich ist,
    ; ist davon auszugehen, dass beide Parameter mehrere Dateinamen enthalten, der Parameter $wFlags wird deshalb mit
    ; dem Flag $FOF_MULTIDESTFILES verodert (d.h. das Flag wird hinzugefügt, wenn es nicht schon gesetzt ist).
    If $iFrom > 2 And $iTo > 2 And $iFrom = $iTo Then
    $wFlags = BitOR($wFlags, $FOF_MULTIDESTFILES)
    EndIf
    ; Wenn der Parameter $sTitle nicht leer ist, wird er in eine UNICODE-String-Struktur übertragen (s.o.)
    If $sTitle Then
    ; Struktur erstellen
    Local $tTitle = DllStructCreate("WChar[" & StringLen($sTitle) + 1 & "]")
    ; Daten übertragen
    DllStructSetData($tTitle, 1, $sTitle)
    ; Zeiger holen
    $pTitle = DllStructGetPtr($tTitle)
    EndIf
    ; Jetzt kann die oben angelegte Struktur SHFILEOPSTRUCT endlich gefüllt werden ...
    DllStructSetData($tSHFILEOPSTRUCT, "hWnd", $hWnd) ; hwnd <- Parameter
    DllStructSetData($tSHFILEOPSTRUCT, "wFunc", $wFunc) ; wFunc <- Parameter
    DllStructSetData($tSHFILEOPSTRUCT, "pFrom", $pFrom) ; pFrom <- Zeiger auf UNICODE-String-Struktur $tFrom
    DllStructSetData($tSHFILEOPSTRUCT, "pTo", $pTo) ; pTo <- Zeiger auf UNICODE-String-Struktur $tTo
    DllStructSetData($tSHFILEOPSTRUCT, "fFlags", $wFlags) ; fFlags <- Parameter
    DllStructSetData($tSHFILEOPSTRUCT, "fAborted", 0) ; fAnyOperationsAborted <- NULL als Grundstellung
    DllStructSetData($tSHFILEOPSTRUCT, 7, 0) ; hNameMappings - wird nicht unterstützt
    DllStructSetData($tSHFILEOPSTRUCT, "pTitle", $pTitle) ; lpszProgressTitle <- Zeiger auf UNICODE-String-Struktur $tTitle
    ; ... und nun kann die Funktion SHFileOperation() per DllCall() aufgerufen werden.
    Local $aResult = DllCall("Shell32.dll", "INT", "SHFileOperationW", "Ptr", DllStructGetPtr($tSHFILEOPSTRUCT))
    ; Fehlerbehandlung
    If @error <> 0 Then Return SetError(1, @error, False)
    If $aResult[0] <> 0 Then Return SetError(2, $aResult[0], False)
    ; Falls das Feld "fAborted" der Struktur SHFILEOPSTRUCT einen Wert ungleich Null enthält, wurde die Aktion vom
    ; Anwender abgebrochen, @extended wird dann auf 1 gesetzt.
    If DllStructGetData($tSHFILEOPSTRUCT, "fAborted") Then Return SetExtended(1, True)
    ; Alles sollte wunschgemäß gelaufen sein.
    Return True
    EndFunc ;==>_SHFileOperation

    [/autoit]
  • @Grossvater
    Vielen Dank für Deine Mühe.
    Ich werde das mal studieren. Vermutlich brauche ich mehrere Jahre, bis ich das verstehe :)
    Aber man lernt ja immer mal wieder dazu. Ist auf jeden Fall sehr interessant!

    Sprenger120
    Auch Dir dankeschön! Nun lade ich gleich mal die Shell32!

    Veronesi