Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TJumpList ist recht eigenwillig (https://www.delphipraxis.net/213612-tjumplist-ist-recht-eigenwillig.html)

Ydobon 26. Aug 2023 11:30

TJumpList ist recht eigenwillig
 
Hallo,

ich verwende die Komponente und fülle sie im Quelltext mit einem Task und zwei Nutzerkategorien mit wechselnden Einträgen. Dabei kommt aber störend oft die Fehlermeldung

"JumpList-Exception: Fehler -2147023721: Neue Sprungliste wird übergeben."

Damit es mehr Spaß macht ist der Fehler zudem absolut nicht reproduzierbar. Einmal funktioniert es, bei den nächsten Läufen auch oder aber die Fehlermeldung kommt. Die natürlich auch schon beim ersten Mal kommen kann. Scheinbar passiert es nur öfter außerhalb der IDE und das Erstellen der Tasklist ist wohl sicher. Weil das nicht reicht, wechselt die Stelle noch ständig. Mal beim Erzeugen eines Items, mal beim Setzen einer Eigenschaft davon. Ob sonstige Einstellungen im Objektinspektor oder im Quelltext gesetzt werden spielt keine Rolle.
Google liefert nichts brauchbares, Bing absolut nichts brauchbares.

Hat eventuell jemand schon Erfahrungen mit solchen Problemen und kann vielleicht sogar dabei helfen?

Dalai 26. Aug 2023 15:26

AW: TJumpList ist recht eigenwillig
 
Hast du mal nach dem entsprechenden Hex-Code 0x80070497 gesucht? In Verbindung mit HRESULT oder "jump list" gibt das einige Ergebnisse. Ob da brauchbare dabei sind, kann ich nicht wirklich beurteilen.

Grüße
Dalai

Ydobon 27. Aug 2023 07:31

AW: TJumpList ist recht eigenwillig
 
Danke für die Mühe, aber wie gehabt, bestenfalls die Erwähnung eines Fehlers ohne Gründe oder gar Lösungsmöglichkeiten.

jaenicke 28. Aug 2023 11:30

AW: TJumpList ist recht eigenwillig
 
Hast du einen Stacktrace zu einem solchen Fehler?

Ydobon 28. Aug 2023 18:16

AW: TJumpList ist recht eigenwillig
 
So etwas?

[00A43822] Vcl.JumpList.TCustomJumpList.CheckUpdateError (Line 906, "Vcl.JumpList.pas" + 8) + $36
[00A43AE1] Vcl.JumpList.TCustomJumpList.UpdateList (Line 960, "Vcl.JumpList.pas" + 45) + $23
[00A4299A] Vcl.JumpList.TCustomJumpList.DoAutoRefresh (Line 545, "Vcl.JumpList.pas" + 1) + $0
[00A42E38] Vcl.JumpList.TCustomJumpList.OnListChange (Line 657, "Vcl.JumpList.pas" + 0) + $0
[00A422CE] Vcl.JumpList.TJumpCategories.Update (Line 371, "Vcl.JumpList.pas" + 3) + $5
[008CE0CB] System.Classes.TCollectionItem.Changed (Line 6193, "System.Classes.pas" + 3) + $4
[00A41CAA] Vcl.JumpList.TJumpCategoryItem.OnItemsChange (Line 207, "Vcl.JumpList.pas" + 0) + $2
[00A4243E] Vcl.JumpList.TJumpListCollection.Update (Line 416, "Vcl.JumpList.pas" + 3) + $5
[008CE426] System.Classes.TCollection.Changed (Line 6325, "System.Classes.pas" + 0) + $A
[008CE7EA] System.Classes.TCollection.InsertItem (Line 6458, "System.Classes.pas" + 8) + $2
[008CE1E4] System.Classes.TCollectionItem.SetCollection (Line 6227, "System.Classes.pas" + 4) + $8
[008CE054] System.Classes.TCollectionItem.Create (Line 6170, "System.Classes.pas" + 1) + $6
[00A41D32] Vcl.JumpList.TJumpListItem.Create (Line 241, "Vcl.JumpList.pas" + 1) + $6
[008CE333] System.Classes.TCollection.Add (Line 6292, "System.Classes.pas" + 1) + $7
[00A49933] Unit1.TForm1.UndAb (Line 283, "Unit1.pas" + 12) + $19
[00A4B863] Unit1.TForm1.FormCreate (Line 614, "Unit1.pas" + 7) + $3
[009FAD09] Vcl.Forms.TCustomForm.DoCreate (Line 4160, "Vcl.Forms.pas" + 3) + $C
[009FA8E4] Vcl.Forms.TCustomForm.AfterConstruction (Line 4043, "Vcl.Forms.pas" + 1) + $4
[00828D09] System.@AfterConstruction$qqrxp14System.TObject (Line 19684, "System.pas" + 2) + $5
[009FA8A0] Vcl.Forms.TCustomForm.Create (Line 4033, "Vcl.Forms.pas" + 36) + $2D
[00A06C12] Vcl.Forms.TApplication.CreateForm (Line 11607, "Vcl.Forms.pas" + 13) + $B
(00235E61) [00A56E61]

Wirklich hilfreich ist das für mich aber nicht. In UpdateList habe ich nichts gesehen. Liegt wohl auch daran, dass man nicht weiß, wann der Fehler nun auftritt.
Ich dachte, es könnte eventuell am Rechner liegen, aber in C# bekomme ich nicht mal gelegentlich einen Fehler.

himitsu 28. Aug 2023 19:43

AW: TJumpList ist recht eigenwillig
 
Zitat:

[00A43822] Vcl.JumpList.TCustomJumpList.CheckUpdateError (Line 906, "Vcl.JumpList.pas" + 8) + $36
[00A43AE1] Vcl.JumpList.TCustomJumpList.UpdateList (Line 960, "Vcl.JumpList.pas" + 45) + $23
[00A4299A] Vcl.JumpList.TCustomJumpList.DoAutoRefresh (Line 545, "Vcl.JumpList.pas" + 1) + $0
Ja, selbst nachsehn ist einfach, aber Andere .... da kann durch eine andere Delphi-Version oder Update-Stand bissl was verrutschen, aber dafür ist dann die relative Position gut, ab dem ersten Begin der Methode.

Delphi-Quellcode:
function TCustomJumpList.CheckUpdateError(ErrNo: HRESULT; const Description: string): Boolean;
var
  LHandled: Boolean;
begin
  Result := Succeeded(ErrNo);
  if not Result then
  begin
    LHandled := false;
    if Assigned(FOnListUpdateError) then
      FOnListUpdateError(Self, ErrNo, Description, LHandled);
    if not LHandled then
      raise EJumpListException.CreateFmt(SJumplistException, [ErrNo, Description]);
  end;
end;
Möglicher Bugfix Fehlerabfangen/-ignorieren:
OnListUpdateError und dort True zurückgeben. :duck:



So, nun weiter zur eigentlichen Ursache....
Delphi-Quellcode:
function TCustomJumpList.UpdateList: Boolean;
...
begin
      ...
      if CheckUpdateError(FDestinationList.BeginList(LMaxSlots, IID_IObjectArray, LRemovedTasks), SJumplistErrorBeginlist) then
      begin
          ...
          Result := CheckUpdateError(FDestinationList.CommitList, SJumplistErrorCommitlist);
Warum sagt das FDestinationList.CommitList denn nun "Nöööö"?

usw.




Da FDestinationList ein Interface ist und aus diesem Stückchen Code nicht erkennbar ist, was dahinter liegt ... am Enfachsten zur Laufzeit reindebuggen und schauen wo man landet.

jaenicke 28. Aug 2023 19:44

AW: TJumpList ist recht eigenwillig
 
Ich habe noch nicht nachgeschaut, das ist ins Blaue geraten:
Hast du mal versucht, das nicht im OnCreate des Formulars zu machen, sondern abgekoppelt, z.B. mit TThread.ForceQueue?

himitsu 28. Aug 2023 20:01

AW: TJumpList ist recht eigenwillig
 
Zumindestens am Laden der DFM und Erstellungsreihenfolge wird es wohl nicht liegen.

OldCreateOrder gibt es nicht mehr, also muß OnCreate aus'm AfterConstruction kommen, nachdem alles aus der DFM fertig geladen und die FormInstanz erzeugt+verlinkt wurde.

Ydobon 29. Aug 2023 06:09

AW: TJumpList ist recht eigenwillig
 
Zitat:

Zitat von jaenicke (Beitrag 1526203)
Hast du mal versucht, das nicht im OnCreate des Formulars zu machen, sondern abgekoppelt, z.B. mit TThread.ForceQueue?

Zumindest daran sollte es nicht liegen. Ursprünglich und immer noch zusätzlich hatte ich es für die Funktionstests auf einen Button gelegt. Da gab es den Fehler auch schon. Bislang habe ich es auch noch nicht geschafft mit Einzelschritten an die genaue Stelle des Fehlers zu kommen. Der tritt eventuell wirklich nur ohne Haltepunkte auf. Bis zum Wochenende habe ich zz. tagsüber auch nur Visual Studio zur Verfügung.

jaenicke 29. Aug 2023 07:16

AW: TJumpList ist recht eigenwillig
 
Zitat:

Zitat von Ydobon (Beitrag 1526208)
Bislang habe ich es auch noch nicht geschafft mit Einzelschritten an die genaue Stelle des Fehlers zu kommen. Der tritt eventuell wirklich nur ohne Haltepunkte auf.

Die genaue Fehlerstelle hast du ja im Stacktrace und der Wert des HRESULTs hast du auch (-2147023721):
https://learn.microsoft.com/en-us/wi...ist-commitlist

Da der Fehler in der API auftritt, wirst du da auch im Debugger nicht viel sehen können.

Es klingt ja so, als ob der Fehler zwar nicht jedes Mal auftritt, aber mit etwas probieren relativ schnell kommt, oder? Kannst du das auch in einem separaten Projekt reproduzieren, dass du hier zeigen könntest?

himitsu 29. Aug 2023 09:44

AW: TJumpList ist recht eigenwillig
 
Code:
-2147023721
$80070497
 S        Severity = 1 = Failure
 R        Second Severity = 0 (z.B. 1=Warning oder Hint)
 C        Customer Defined = 0
 N        0
  X       0
  FFF     Facility = Win32
     CCCC Code = $0497 = ERROR_UNABLE_TO_REMOVE_REPLACED
                         Die zu ersetzende Datei kann nicht entfernt werden.
hmmmmmmmmmmmmmmm? :gruebel:

1175 (0x497) -> https://learn.microsoft.com/de-de/wi...es--1000-1299-

Delphi-Quellcode:
ShowMessage(SysErrorMessage($80070497)); // Cardinal o_O
RaiseLastOSError(-2147023721); // Integer

Ydobon 29. Aug 2023 17:22

AW: TJumpList ist recht eigenwillig
 
Zitat:

Zitat von jaenicke (Beitrag 1526210)
Es klingt ja so, als ob der Fehler zwar nicht jedes Mal auftritt, aber mit etwas probieren relativ schnell kommt, oder? Kannst du das auch in einem separaten Projekt reproduzieren, dass du hier zeigen könntest?

Wie es sein soll, wenn ich ihn provozieren will, kommt er ewig nicht. Wenn ich das Programm mal laufen lasse, kann er gar nicht oft genug kommen.

Zitat:

Zitat von himitsu (Beitrag 1526218)
Code:
-2147023721
$80070497
 S        Severity = 1 = Failure
 R        Second Severity = 0 (z.B. 1=Warning oder Hint)
 C        Customer Defined = 0
 N        0
  X       0
  FFF     Facility = Win32
     CCCC Code = $0497 = ERROR_UNABLE_TO_REMOVE_REPLACED
                         Die zu ersetzende Datei kann nicht entfernt werden.
hmmmmmmmmmmmmmmm? :gruebel:[/DELPHI]

Ja, das ist einer der wenigen Treffer zu dem Fehler die man im Netz finden kann. Ich wollte das aber nach Möglichkeit ignorieren, erstens, weil ich keine wirkliche Verbindung erkennen kann (na ja, siehe unten) und zweitens weil es so wohl aussichtslos ist, etwas zu unternehmen. Allerdings, Windows schreibt seine JumpList-Schandtaten u.a. in %APPDATA%\Microsoft\Windows\Recent\CustomDestinati ons tatsächlich auf die Festplatte. Möglich wären Zugriffskonflikte also. Nur, warum ausgerechnet bei meinem Progrämmchen? Das macht doch nichts wildes. JumpLists gibt es seit Windows 7, wenn er häufiger auftreten sollte, wäre vermutlich mittlerweile das Internet voll davon.

jaenicke 29. Aug 2023 17:31

AW: TJumpList ist recht eigenwillig
 
Wenn es wirklich ein Dateizugriffsproblem sein sollte, kommt natürlich automatisch das Antivirenprogramm in den Blickpunkt.

Außerdem könntest du den Process Monitor mitlaufen lassen und, wenn der Fehler auftritt, nachschauen, ob da Fehler geloggt werden.

Ydobon 29. Aug 2023 18:00

AW: TJumpList ist recht eigenwillig
 
Ich habe mal ein Minimalprogramm erstellt. Hier ist er auch da.
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  item: TJumpListItem;
begin
  JumpList1.AddCategory('eins');
  JumpList1.AddCategory('zwei');
  item := JumpList1.TaskList.Add as TJumpListItem;
  item.FriendlyName := 'OSK';
  item.path := 'C:\Windows\System32\osk.exe';
  item.Icon := 'C:\Windows\System32\osk.exe';
  for var i := 0 to 4 do
  begin
    item := JumpList1.CustomCategories[0].Items.Add as TJumpListItem;
    with item do
    begin
      path := Application.ExeName;
      Arguments := 'Test'+i.ToString;
      FriendlyName := 'Test'+i.ToString;
      path := Application.ExeName;
      icon := Application.ExeName
    end;
  end;
end;
Die Idee mit dem Virenscanner scheint ziemlich gut gewesen zu sein. Wenn der abgeschaltet ist, geht es anscheinend ohne Fehlermeldung. Also erstmal danke.
Jetzt muss ich nur noch herausbekommen, wie ich dem Scanner abgewöhne dort zu stänkern. Kann ja nicht ständig das Internet abschalten. Schlucken tut er ihn nicht. Na ja, wollte sowieso wechseln.

jaenicke 29. Aug 2023 18:29

AW: TJumpList ist recht eigenwillig
 
Vielleicht reicht es ja, wenn du die Exe oder das von dir genannte Verzeichnis als Ausnahme hinzufügst.

Ydobon 30. Aug 2023 06:08

AW: TJumpList ist recht eigenwillig
 
Geht leider nicht, das Verzeichnis "existiert nicht". Wenn ich es oberhalb mit 'recent' - also 'Zuletzt verwendet' versuche, will er gleich den ganzen Dokumentenornder raus nehmen. Den würde ich aber eher ungern aus der Überwachung entfernen.
Bleibt noch die Frage, was macht C# anders, dass der Fehler dort nicht auftritt?

Sinspin 30. Aug 2023 12:58

AW: TJumpList ist recht eigenwillig
 
Zitat:

Zitat von himitsu (Beitrag 1526202)
Delphi-Quellcode:
function TCustomJumpList.CheckUpdateError(ErrNo: HRESULT; const Description: string): Boolean;
var
  LHandled: Boolean;
begin
  Result := Succeeded(ErrNo);
  if not Result then
  begin
    LHandled := false;
    if Assigned(FOnListUpdateError) then
      FOnListUpdateError(Self, ErrNo, Description, LHandled);
    if not LHandled then
      raise EJumpListException.CreateFmt(SJumplistException, [ErrNo, Description]);
  end;
end;
Möglicher Bugfix Fehlerabfangen/-ignorieren:
OnListUpdateError und dort True zurückgeben. :duck:

Hattest Du das gesehen?
Das ist zwar keine Lösung des wirklichen Problems, aber Du kannst den Fehler fangen.

himitsu 30. Aug 2023 13:23

AW: TJumpList ist recht eigenwillig
 
Vielleicht nicht unbedingt "blind" ein
Delphi-Quellcode:
Result := True;
, aber zumindestens
Delphi-Quellcode:
Result := WinErrorCode = $80070497;
.

Ydobon 30. Aug 2023 17:42

AW: TJumpList ist recht eigenwillig
 
Zitat:

Zitat von Sinspin (Beitrag 1526254)
Das ist zwar keine Lösung des wirklichen Problems, aber Du kannst den Fehler fangen.

Doch schon, aber ich wollte es so lange wie möglich ignorieren. Wenn man die Fehlermeldung abschaltet, ist der Fehler ja immer noch da. Falls das Schreiben der Datei tatsächlich nicht klappt, die wird doch sicherlich von Windows ausgelesen, wenn die Jumpliste angezeigt wird.

Allerdings scheint es zu funktionieren. Selbst wenn der Fehler auftritt landet wohl alles was soll auch in der Liste. Sie soll ja sowieso nur funktionieren, so lange das Programm läuft, vielleicht hat Windows dann alles im Speicher. Mit Bauchschmerzen wäre es eine Lösung. Falls die zu stark werden kann ich es ja immer noch in C# umschreiben. Dabei wollte ich nach fast zwei Jahren mal wieder etwas mit Delphi machen.
Also Danke an alle, die versucht haben mir zu helfen.

himitsu 30. Aug 2023 18:50

AW: TJumpList ist recht eigenwillig
 
Zumindestens kannst du es dort still und heimlich loggen, damit es nicht ganz verschwindet.
Und jupp, darum auch die Einschränkung auf den einen Fehlercode, damit andere Fehler dennoch gezeigt werden.


Zitat:

ja immer noch in C# umschreiben
Aktuell lösen wir es zwar über eine *.EML ans StandardMailProgramm,
aber prinzipiell haben wir für die MAPI, mit Dateianhängen an Outlook, auch ein C#-Konsolenprogramm gebastelt, was die OfficeAPI im .NET nutzt, weil MSOffice mag die MAPI oft nicht.

Ydobon 31. Aug 2023 16:41

AW: TJumpList ist recht eigenwillig
 
Tja, Hejlsberg bleibt Hejlsberg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 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