GetActiveObject 获取多个实例
示例代码获取多个AutoCAD的IAcadApplication实例,只要修改Guid,就可以获取其它类型实例 [DllImport("ole32.dll", EntryPoint = "CreateBindCtx")] public static extern int CreateBindCtx_(int reserved, out IBindCtx ppbc); /// <summary> /// 枚举当前所有活动的CAD进程(暂时只能枚举AutoCAD2008的,后续再增加) /// </summary> /// <param name="apps"></param> public void ListAllCADApplication(List<IAcadApplication> apps) { IBindCtx pbc = null; CreateBindCtx_(0, out pbc); IRunningObjectTable pprot = null; pbc.GetRunningObjectTable(out pprot); IEnumMoniker ppenumMoniker = null; pprot.EnumRunning(out ppenumMoniker); ppenumMoniker.Reset(); IMoniker[] rgelt = new IMoniker[1]; rgelt[0] = null; int rc = 0; rc = ppenumMoniker.Next(1, rgelt, IntPtr.Zero); while (rgelt[0] != null) { string ppszDisplayName; rgelt[0].GetDisplayName(pbc, null, out ppszDisplayName); //可以在注册表中"HKEY_LOCAL_MACHINE\SOFTWARE\Classes"下面找到对应的GUID if (string.Compare(ppszDisplayName, "!{6AB55F46-2523-4701-A912-B226F46252BA}", true) == 0) { //是AutoCAD2008进程 object obj = null; pprot.GetObject(rgelt[0], out obj); if (obj == null) { continue; } IAcadApplication app = (IAcadApplication)obj; if (app == null) { continue; } apps.Add(app); } rgelt[0] = null; rc = ppenumMoniker.Next(1, rgelt, IntPtr.Zero); } }查看完整版本: GetActiveObject 获取多个实例
Tags: GetActiveObject, 多个实例