zoukankan      html  css  js  c++  java
  • 解决C#,CAD二次开发实例化AcadApplicationClass失败

    用C#,CAD做的一个程序,环境(vs2008,AutoCAD2007 32位)代码如下

            private void Form1_Load(object sender, EventArgs e)
            {
                AcadApplicationClass tApplication = null;
    
                try
                {
                    tApplication = new AcadApplicationClass();             
    
                    tApplication.Quit();
    
                    MessageBox.Show("成功启动");
    
                    Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("启动失败");
    
                    Close();
                }
            }
    

     其中,在new AcadApplicationClass()时,如果系统为64位系统,或者Server2003(包括32和64位),第一次执行时会卡几分钟,最后报错——检索 COM 类工厂中 CLSID 为 {28B7AA99-C0F9-4C47-995E-8A8D729603A1} 的组件时失败,原因是出现以下错误: 80080005。但此时再次重新执行,则成功。

    目前我的解决办法不是很好,就是用执行exe的方法去启动CAD程序,然后再获取CAD程序,这样

                    string tAcadExePath = CADVersionHelper.GetAcadLocaton();
                    //执行Exe方式启动CAD
                    Process.Start(tAcadExePath);
    
                    AcadApplication tAcadApplication = null;
                    //由于AutoCAD启动需时间,因此每嘅一定时间获取一次
                    int tCheckTime = 0;
                    while (tCheckTime <= 20)
                    {
                        try
                        {
                            tCheckTime++;
    
                            Thread.Sleep(2000);
    
                            tAcadApplication = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application." + CADVersionHelper.CADVersionNo);
    
                            tAcadApplication.Visible = false;
    
                            break;
                        }
                        catch
                        { }
                    }
    
                    return tAcadApplication;

    其中tAcadExePath是CAD主程序acad.exe的路径,CADVersionHelper.CADVersionNo是CAD的内部版本号(如2007是17.0),那个while循环是因为如果CAD没完成启动Marshal.GetActiveObject获取不到CAD程序,因为每隔2秒获取一次,直到成功获取为止,最多获取20次

  • 相关阅读:
    不记住密码
    在Docker中进行Redis主从配置
    Spring Boot系列(8)——RabbitMQ确认、退回模式及死信队列
    RabbitMQ基础
    CentOS只有lo和ens33网卡的解决方案
    Spring Boot系列(7)——自定义异常反馈
    Spring Boot系列(6)——Configurer和Customizer
    以form表单重用方式进行数据列表行删除
    Spring Boot系列(5)——Restful CURD注意事项
    Spring Boot系列(4)——实现国际化
  • 原文地址:https://www.cnblogs.com/cannel/p/2811016.html
Copyright © 2011-2022 走看看