![]() |
TJumpTask.Apply funktioniert nicht mehr
Schon seit es das Feature in Windows gibt, benutze ich die Komponente TJumpTask.
Heute habe ich festgestellt, dass Apply nicht mehr funktioniert, eine Exception wirft und somit keine Einträge mehr in die JumpList hinzugefügt werden. Mein simpler Code:
Delphi-Quellcode:
Also bin ich auf die Suche gegangen. In der Prozedur Apply tritt die Exception bei folgender Zeile auf:
var
aJLItem: TJumpTask; begin try aJLItem := TJumpTask.Create; aJLItem.Title := aCaption; aJLItem.ApplicationPath := ParamStr(0); aJLItem.Arguments := aArguments; aJLItem.CustomCategory := 'Test-Cat'; aJumpList.JumpItems.Add(aJLItem); aJumpList.Apply; // <= Exception, siehe unten except end; end;
Delphi-Quellcode:
CheckResult(cdl.AppendCategory(PWideChar(Categories[cnt]), oav));
Delphi-Quellcode:
Ich habe nie irgendetwas geändert. Weder an der Komponente, noch an meinem eigenen Code.
class procedure TJumpList.CheckResult(ACode: HRESULT);
var S: string; begin if (not SUCCEEDED(ACode)) then begin S := SysErrorMessage(Cardinal(ACode)); if S = '' then FmtStr(S, 'Error %.8x', [ACode]); raise Exception.Create(S); end; end; Die Exception ist wenig aussagekräftig: Zitat:
|
AW: TJumpTask.Apply funktioniert nicht mehr
Welches System?
Schalte mal UAC aus. Wenn es daran nicht liegt und du W7 verwendest prüfe mal ob du unter Eigenschaften von Taskleiste/Startmenü die beiden Checkboxen aktiviert hast. gruss |
AW: TJumpTask.Apply funktioniert nicht mehr
Danke für den Hinweis!
Der Eintrag "Zuletzt geöffnete Elemente im Startmenu und in der Taskleiste speichern und anzeigen" war un-checked und sogar ausgegraut. Habe das jetzt behoben und es funktioniert wieder. Danke für den Hinweis! |
AW: TJumpTask.Apply funktioniert nicht mehr
Zitat:
Deine Lösung ist also temporär nichts für die Allgemeinheit solltest du deine Anwendung veröffentlichen. Wenn es bei dir nicht kracht dann kracht es bei jemand anderen. Habe mir das Teil mal angeschaut. Ich würde
Delphi-Quellcode:
in Apply entfernen und selber prüfen ob HResult = 0 ist.
CheckResult(ACode : HRESULT);
so wie es im Moment aufgebaut ist kannst du von außen den Fehler nicht abfangen und darauf reagieren. Meine Änderung..
Delphi-Quellcode:
function TJumpList.Apply: HRESULT;
begin Result := 1; if (CheckWin32Version(6, 1)) then begin Result := ApplyList; end; end; function TJumpList.ApplyList: HRESULT; var cdl: JumpList.ICustomDestinationList; cMinSlots: UINT; poaRemoved: IObjectArray; Categories: TStringList; cnt: Integer; Items: TList<TJumpItem>; Item: TJumpItem; pUnk: IUnknown; oav: IObjectArray; number: UINT; begin Result := 1; if SUCCEEDED(CoCreateInstance(CLSID_DestinationList, nil, CLSCTX_INPROC_SERVER, IID_ICustomDestinationList, pUnk)) then begin if pUnk <> nil then pUnk.QueryInterface(JumpList.ICustomDestinationList, cdl); if (cdl <> nil) then begin if FApplicationId <> '' then if (not SUCCEEDED(cdl.SetAppID(PChar(FApplicationId)))) then exit; if (not SUCCEEDED(cdl.BeginList(cMinSlots, IID_IObjectArray, poaRemoved))) then exit; if ShowFrequentCategory then if (not SUCCEEDED(cdl.AppendKnownCategory(KDC_FREQUENT))) then exit; if ShowRecentCategory then if (not SUCCEEDED(cdl.AppendKnownCategory(KDC_RECENT))) then exit; Categories := TStringList.Create; Items := TList<TJumpItem>.Create; try Categories.Duplicates := dupIgnore; Categories.Sorted := true; for cnt := 0 to FJumpItems.Count - 1 do begin Categories.Add(TJumpItem(FJumpItems[cnt]).CustomCategory); end; for cnt := 0 to Categories.Count - 1 do begin Items.Clear; for Item in FJumpItems do begin if Item.CustomCategory = Categories[cnt] then Items.Add(Item); end; oav := AddCategory(Items); if oav <> nil then begin oav.GetCount(number); if (number > 0) then begin if Categories[cnt] = '' then begin if (not SUCCEEDED(cdl.AddUserTasks(oav))) then exit; end else begin if (not SUCCEEDED(cdl.AppendCategory(PWideChar(Categories[cnt]), oav))) then exit; end; end; end; end; oav := nil; if (not SUCCEEDED(cdl.CommitList)) then exit; finally Categories.Free; Items.Free; cdl := nil; end; end; end; end;
Delphi-Quellcode:
Du kannst es aber auch so lassen wie es ist.. (Nur ein Vorschlag!)
if (Not aJumpList.Apply := S_OK) then
MessageBox('Fehlermeldung was auch immer' Solltest du einen Fehler finden berichtige ihn bitte selbst. Nebenbei es werden alle CoCreateInstancen nicht auf Fehler geprüft.. Meiner Meinung nach ein Muss! Zusätzliche Frage.. Fehlt in Create nicht ein CoInitialize? und in Destroy ein CoUninitialize? gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz