AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TJumpTask.Apply funktioniert nicht mehr

Ein Thema von dGeek · begonnen am 20. Jul 2016 · letzter Beitrag vom 20. Jul 2016
Antwort Antwort
dGeek
(Gast)

n/a Beiträge
 
#1

TJumpTask.Apply funktioniert nicht mehr

  Alt 20. Jul 2016, 18:44
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:
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;
Also bin ich auf die Suche gegangen. In der Prozedur Apply tritt die Exception bei folgender Zeile auf:
CheckResult(cdl.AppendCategory(PWideChar(Categories[cnt]), oav));
Delphi-Quellcode:
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;
Ich habe nie irgendetwas geändert. Weder an der Komponente, noch an meinem eigenen Code.

Die Exception ist wenig aussagekräftig:
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt TestProjekt.exe ist eine Exception der Klasse Exception mit der Meldung 'Zugriff verweigert' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Was zur Hölle kann da los sein?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: TJumpTask.Apply funktioniert nicht mehr

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

Geändert von EWeiss (20. Jul 2016 um 21:04 Uhr)
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#3

AW: TJumpTask.Apply funktioniert nicht mehr

  Alt 20. Jul 2016, 21:38
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!
  Mit Zitat antworten Zitat
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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf