Einzelnen Beitrag anzeigen

ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Running Object Table - Office-Dateien aus OneDrive

  Alt 9. Feb 2023, 10:47
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
Thomas

Geändert von ThoPos ( 9. Feb 2023 um 11:17 Uhr)
  Mit Zitat antworten Zitat