Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#4

AW: TJumpTask.Apply funktioniert nicht mehr

  Alt 20. Jul 2016, 23:54
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

Geändert von EWeiss (21. Jul 2016 um 09:00 Uhr)
  Mit Zitat antworten Zitat