示例代码获取多个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);
}
}


杭州格原