Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Running Object Table - Office-Dateien aus OneDrive (https://www.delphipraxis.net/212431-running-object-table-office-dateien-aus-onedrive.html)

ThoPos 9. Feb 2023 09:47

Running Object Table - Office-Dateien aus OneDrive
 
Hallo zusammen,

ich habe vor über 10 Jahren mit einer super Unterstützung der Forenmitglieder folgende Procedure gebastelt, welche mir alle Einträge der Running Object Table liefert und bei den Dateien von Word und Excel zusätzlich, mit welchem der beiden Programme die Datei geöffnet ist.

Code:
uses
  winapi.ActiveX,
  win.ComObj,
  winapi.UrlMon;

procedure test;
var
  ROT: IRunningObjectTable;
  Enum: IEnumMoniker;
  Fetched: Integer;
  RunningObj: IMoniker;
  Name: PWideChar;
  BindCtx: IBindCtx;
  ClassID: TGUID;
  ProgID: String;
  Mk: IMoniker;
  chEaten: ULONG;
  DmyObj: IUnknown;
  Datei: OLEVariant;
  App: OLEVariant;
  Z: Boolean;
  i: Integer;
  l: TListItem;
begin
  ListView1.Items.Clear;
  OleCheck(CreateBindCtx(0, BindCtx));
  OleCheck(GetRunningObjectTable(0, ROT));
  if ROT.EnumRunning(Enum) = S_OK then
  begin
    Enum.Next(1, RunningObj, @Fetched);
    while RunningObj <> nil do
    begin
      RunningObj.GetDisplayName(BindCtx, nil, Name);
      l := ListView1.Items.Add;
      l.SubItems.Add(name);
      try
        RunningObj.GetClassID(ClassID);
        ProgID := ClassIDToProgID(ClassID);
      except
        ProgID := '';
      end;
      l.SubItems.Add(ProgID);
      if UpperCase(ProgID) = 'FILE' then
      begin
        try
          OleCheck(CreateBindCtx(0, BindCtx));
          OleCheck(MkParseDisplayNameEx(BindCtx, PWideChar(WideString(Name)), chEaten, Mk));
          OleCheck(Mk.BindToObject(BindCtx, nil, IUnknown, DmyObj));
          Datei := DmyObj as IDispatch;
          try
            App := Datei.Application;
            l.SubItems.Add(app.name);
          except

          end;
        except

        end;
      end;
      Enum.Next(1, RunningObj, @Fetched);
    end;
  end;
  for i := 0 to Pred(ListView1.Columns.Count) do
  begin
    ListView1.Column[i].Width := 10;
    ListView1.Column[i].Width := -2;
  end;
end;
Solange die Dateien von einem Laufwerk geöffnet werden, ist alles super.

Nur bei OneDrive gibt es Probleme.
1. Bei Excel-Dateien bekommt er bei "ClassIDToProgID(ClassID);" kein "file" zurück; bei Word-Dateien schon.
2. Und bei Excel- und Word-Dateien kann er den Befehl "App := Datei.Application;" nicht ausführen und läuft in die Exception.

Würde und könnte mir einer von Euch helfen?

Gruß und Danke

Delphi.Narium 9. Feb 2023 10:43

AW: Running Object Table - Office-Dateien aus OneDrive
 
Man könnte hieraus
Delphi-Quellcode:
except

end;
mal ein
Delphi-Quellcode:
except
  on e : Exception do begin
    MessageDlg(e.Message,mtError,[mbOk],0);
  end;
end;
machen, um zu erfahren, was für ein Fehler auftritt. Dies erhöht die Chance auf eine sinnvolle Hilfe zur Fehlerbehebung nicht unerheblich.

ThoPos 9. Feb 2023 17:00

AW: Running Object Table - Office-Dateien aus OneDrive
 
Danke für den Tipp:

Bei Excel-Dateien liefert "ClassIDToProgID(ClassID)" die Exception "Klasse nicht registriert".
Bei Word-Dateien liefert "Datei.Application" die Exception "Application wird vom Automatisierungsobjekt nicht unterstützt". Merkwürdigerweise öffnet sich jetzt zusätzlich zu dem Dialogfeld der Browser mit der Meldung "Seite nicht gefunden" und Angabe der OneDrive-Adresse der Word-Datei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz