_WinAPI_ShellChangeNotifyRegister 64bit - Absturz

  • Hi,
    ich möchte mit "_WinAPI_ShellChangeNotifyRegister" feststellen, ob ein Ordner existiert oder nicht.

    Code
    !>14:34:01 AutoIt3.exe ended.rc:-1073741819

    Mit #AutoIt3Wrapper_UseX64=N startet das Skript und registriert auch Änderungen, wenn der Ordner umbenannt wird.
    Mit #AutoIt3Wrapper_UseX64=Y stürzt das Skript direkt ab.

  • Ich habe das mal auf 64 Bit angepasst:

  • Wow danke sieht sehr gut aus.
    Allerdings stürzt es bei 4 und mehr Ordnern ab.


  • Moin,

    frohes neues Jahr! Hoffen wir mal, dass sich der Temperaturanstieg in 2025 gegenüber 2023 und 2024 wieder umkehrt und weniger Flächen überflutet werden.

    Zum Thema:

    Code
    For $i = 0 To UBound($aPaths) - 1
    		$aPaths[$i] = _WinAPI_ShellILCreateFromPath(_WinAPI_PathSearchAndQualify($aPaths[$i]))
    		DllStructSetData($tEntry, (@AutoItX64 ? 4 : 2) * $i + 1, $aPaths[$i]) ; bei 64Bit ist PIDLIST_ABSOLUTE = 64 Bit (4 Byte)
    		DllStructSetData($tEntry, (@AutoItX64 ? 4 : 2) * $i + 2, $bRecursive)
    Next

    Ich denke, dass sich der Feldindex (@AutoItX64 ? 4 : 2) * $i + 1 von 32- zu 64-Bit nicht ändert.

  • Hallo Oscar ,

    das ist eine von den 'Shell-Ausrichtungsfallen'. Die Struktur SHChangeNotifyEntry ist in ShlObj_core.h definiert. Da steht am Anfang ein
    #include <pshpack1.h>   /* Assume byte packing throughout */,
    das auch für die Struktur gilt und ein 'Byte-Packing' erzwingt.

    Deshalb:

    Code
    Func _WinAPI_ShellChangeNotifyRegister64($hWnd, $iMsg, $iEvents, $iSources, $aPaths, $bRecursive = False)
        Local $iPath = $aPaths, $tagStruct = 'align 1;' ; <<<<<<<<<<
  • das ist eine von den 'Shell-Ausrichtungsfallen'. Die Struktur SHChangeNotifyEntry ist in ShlObj_core.h definiert. Da steht am Anfang ein
    #include <pshpack1.h> /* Assume byte packing throughout */,
    das auch für die Struktur gilt und ein 'Byte-Packing' erzwingt.

    Ah! Vielen Dank!

    So funktioniert es dann: