Komfortabler Dateimanager mit vielen Funktionen

Vista und das ShellTaskScheduler-Objekt

By Sven on 20.03.2006 - 17:48 in Windows Vista

Bis einschließlich zum SpeedCommander 10 habe ich Hintergrundaufgaben immer in einem zusätzlichen Thread abgearbeitet. Neben der Verwaltung für die Threads war nachteilig, dass der Hintergrundthread immer erst gestartet werden konnte, nachdem alle Dateieinträge der Dateiliste hinzugefügt wurden. Weiterhin wurden immer alle Informationen ermittelt, da der Hintergrundthread nicht genau erkennen konnte, ob ein Element nun angezeigt wird oder nicht.

Während der Entwicklung von SpeedCommander 11 habe ich dann das ShellTaskScheduler-Objekt entdeckt. Das ShellTaskScheduler-Objekt wird von der Shell zur Verfügung gestellt und implementiert die Schnittstelle IShellTaskScheduler. Es wird mit kleinen Aufgaben gefüttert, die es der Reihe nach in einem Hintergrundthread abarbeitet. Eine Aufgabe ist ein kleines COM-Objekt, welches die Schnittstelle IRunnableTask implementieren muss. Über diese Schnittstelle kann das ShellTaskScheduler-Objekt die Aufgabe dann starten, anhalten, weiterführen oder beenden. Der Programmierer muss sich mit der Threadsteuerung überhaupt nicht beschäftigen.

Das ShellTaskScheduler-Objekt wird im SpeedCommander 11 für alle Hintergrundaufgaben bei der Anzeige eines Ordners verwendet. Dazu gehört das Ermitteln der Dateisymbole, zusätzlicher Informationen in der Detailansicht und das Berechnen der Ordnergrößen. Speziell bei der Anzeige von dynamischen Icons und Miniaturansichten lässt sich im Vergleich zu früheren Versionen ein großer Geschwindigkeitsschub feststellen.

Unter Vista hat das aber plötzlich nicht mehr funktioniert, alle Icons sahen bis auf die Programmdateien gleich aus. Im Debugger musste ich erkennen, dass die Erstellung des ShellTaskScheduler-Objekts fehlschlug:

IShellTaskScheduler2Ptr pScheduler;
HRESULT hResult = CoCreateInstance(CLSID_ShellTaskScheduler, NULL, CLSCTX_INPROC, IID_IShellTaskScheduler, (void**) &pScheduler);

Die Funktion CoCreateInstance gibt unter Vista den Fehlercode E_NOINTERFACE zurück, während es auf allen anderen Systemen von Windows 98 bis Windows XP nie Probleme gab.

Ändert man nun die gesuchte Schnittstelle von IID_IShellTaskScheduler auf IID_IUnknown, so wird das ShellTaskScheduler-Objekt erstellt und kann dann ganz normal verwendet werden:

IShellTaskScheduler2Ptr pScheduler;
HRESULT hResult = CoCreateInstance(CLSID_ShellTaskScheduler, NULL, CLSCTX_INPROC, IID_IUnknown, (void**) &pScheduler);

Unklar bleibt mir aber, warum Microsoft das ganze geändert hat. Die angepasste Version funktioniert übrigens auch auf allen bisherigen Systemen.

Es können keine Kommentare abgegeben werden.

Top