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!
Dann ist definitiv ein Fehler in der Komponente die sollte in der Lage sein den Status vorher zu prüfen.
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
CheckResult(ACode : HRESULT);
in Apply entfernen und selber prüfen ob HResult = 0 ist.
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:
if (Not aJumpList.Apply := S_OK) then
MessageBox('Fehlermeldung was auch immer'
Du kannst es aber auch so lassen wie es ist.. (Nur ein Vorschlag!)
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