private void button1_Click(object sender, EventArgs e) { var books = ExcelSample.GetWorkbooks(); foreach (var (name, obj) in books) { Debug.WriteLine(name); Microsoft.Office.Interop.Excel.Workbook book = obj; Debug.WriteLine(book.FullName); Marshal.ReleaseComObject(obj); } }
//--- using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes;
internal static class ExcelSample { public static Tuple<string, dynamic>[] GetWorkbooks() { var list = new List<Tuple<string, dynamic>>(); if (CreateBindCtx(0, out var ctx) == 0 && ctx != null) { ctx.GetRunningObjectTable(out var rot); rot.EnumRunning(out var enumMoniker); enumMoniker.Reset(); var ms = new IMoniker[1]; while (enumMoniker.Next(1, ms, IntPtr.Zero) == 0) { try { ms[0].GetDisplayName(ctx, null, out var displayName); #if DEBUG ms[0].GetClassID(out var clsid); Debug.WriteLine($"{clsid} / {displayName}"); #endif rot.GetObject(ms[0], out var comObject); if (comObject is Microsoft.Office.Interop.Excel.Workbook) { list.Add(new Tuple<string, dynamic>(displayName, comObject)); } } finally { Marshal.ReleaseComObject(ms[0]); } } Marshal.ReleaseComObject(enumMoniker); Marshal.ReleaseComObject(ctx); Marshal.ReleaseComObject(rot); } return list.ToArray(); }
[DllImport("ole32")] private static extern int CreateBindCtx(int reserved, out IBindCtx ppbc); }