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);
            }

        }

此条目发表在C#分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论