Cad中外部集成进程调用主程序进程的方法及装置的制作方法

文档序号:6437312阅读:321来源:国知局

专利名称::Cad中外部集成进程调用主程序进程的方法及装置的制作方法
技术领域
:本发明涉及计算机软件领域,具体而言,涉及一种CAD中外部集成进程调用主程序进程的方法及装置。
背景技术
:随着CAD软件的发展,对CAD的扩展能力提出了很高的要求。解决办法就是开放二次开发接口,使得用户可以将额外的功能模块也就是“插件”附加到CAD程序上。但是,这种处理方式没有很好解决主程序和插件可能存在的冲突问题,因为主程序和插件的开发往往是由不同的开发商进行,如果插件的开发者在开发插件时引用到了某个和CAD软件开发商组件相同但版本不同的控件或组件,如BCG控件等,此时就有可能出现冲突的情况,甚至导致CAD启动失败。另一方面,插件的不稳定往往影响到CAD主程序,如果插件崩溃了往往导致整个CAD程序的崩溃,从而可能导致用户数据的丢失。目前,一般通过调用COM接口或脚本的方式来加载外部集成应用,实际程序被加载到CAD主程序的进程空间中。但是,上述技术方案会存在以下缺点1)所有插件被加载到CAD主进程中,某一个插件崩溃可能导致整个CAD程序的崩溃。2、兼容性较差,CAD进程引用的组件若和CAD不一致可能导致CAD无法启动。幻性能较差,多个插件共享同一个进程的资源,无法充分利用CPU并行的能力。针对相关技术中的上述问题,目前尚未提出有效的解决方案。
发明内容本发明的主要目的在于提供一种CAD中外部集成进程调用主程序进程的方法及装置,以解决上述问题至少之一。根据本发明的一个方面,提供了一种CAD中外部集成进程调用主程序进程的方法,包括启动CAD主程序进程;为CAD主程序的集成应用创建一个与CAD主程序进程进行交互的独立运行的外部集成进程;外部集成进程响应于用户操作,调用主程序进程执行与用户操作对应的功能。上述外部集成进程响应于用户操作包括将外部集成进程的集成界面嵌入到主程序进程中的主界面容器中;接收用户通过嵌入到主界面容器中的集成界面执行的操作命令。将外部集成进程的集成界面嵌入到主程序进程中的主界面容器中,包括外部集成进程通过调用Windows应用程序接口API中的设置父窗口函数ktParent将集成界面嵌入到主界面容器中。将外部集成进程的集成界面嵌入到主程序进程中的主界面容器中之前,包括启动主程序进程,在主程序界面中加入集成界面容器,并将集成界面容器的句柄传输给外部集成进程。启动CAD主程序进程之后,还包括将集成插件加载至主程序进程,并在加载的集成插件中建立预先定义的CAD功能接口的实例;将实例作为运行对象表的ROT对象注册到ROT列表中。上述方法还包括响应用户通过主程序执行的指定操作,并将执行结果反馈给主程序。上述外部集成进程调用主程序进程执行与用户操作对应的功能,包括外部集成进程获取当前的ROT列表;外部集成进程遍历获取的ROT列表中的ROT对象并查询得到需要的ROT对象;外部集成进程通过查询得到的ROT对象调用主程序进程执行与用户操作对应的功能,以及通过查询得到的ROT对象响应主程序进程的指定操作,并向主程序进程反馈结果。上述方法还包括主程序进程通过查询得到的ROT对象向外部集成进程发送消息或事件。根据本发明的另一方面,提供了一种CAD中外部集成进程调用主程序进程的装置,包括启动模块,用于启动CAD主程序进程;创建模块,用于为CAD主程序的集成应用创建一个与CAD主程序进程进行交互的独立运行的外部集成进程;调用执行模块,用于在外部集成进程响应于用户操作时,调用主程序进程执行与用户操作对应的功能。上述装置还包括嵌入模块,用于将外部集成进程的集成界面嵌入到主程序进程中的主界面容器中;接收模块,用于接收用户通过嵌入到主界面容器中的集成界面执行的操作命令。通过本发明,采用为集成应用对应的外部集成进程与主程序进程独立运行的技术手段,解决了相关技术中由于所有插件被加载到CAD主程序进程中,某一个插件不稳定可能导致整个CAD程序的崩溃以及由于多个插件共享同一个进程无法充分利用CPU并行的能力的技术问题,进而达到了提高CAD主程序的启动速度、减少集成开发难度以及提高了CAD程序的稳定性的效果。此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中图1是根据本发明实施例1的CAD中外部集成进程调用主程序进程的方法的流程图;图2是根据本发明实施例2的CAD中外部集成进程调用主程序进程的装置的结构框图;图3是根据本发明优选实施例2的CAD中外部集成进程调用主程序进程的装置的结构示意图;图4是根据本发明实施例3的CAD中主程序进程和外部集成进程隔离的架构图;图5是根据本发明实施例3的CAD集成界面交互的示例图片。具体实施例方式下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。实施例1图1是根据本发明实施例1的CAD中外部集成进程调用主程序进程的方法的流程图。如图1所示,该方法包括步骤S102,启动CAD主程序进程;在具体实施时,可以包括加载集成插件,其中,所述插件包括用于容纳集成界面的主界面容器,也可以包括用于方便用户操作的主界面菜步骤S104,为CAD主程序的集成应用创建一个与CAD主程序进程进行交互的独立运行的外部集成进程;步骤S106,外部集成进程响应用户操作,调用主程序进程执行与用户操作对应的功能;通过上述处理步骤,由于为集成应用创建了一个可以与主程序进程进行交互但是独立运行的外部集成进程,实现了主程序进程和外部集成进程的隔离,因此,可以提升CAD主程序的启动速度,并且,集成应用可以使用和CAD程序不同版本的组件进行开发而不用担心组件冲突,减少了集成开发的难度,再者,由于外部集成进程是独立运行,集成应用不会影响主程序进程的运行,提高了CAD程序的稳定性。步骤S106中,外部集成进程响应于用户操作,可以包括以下处理过程将外部集成进程的集成界面嵌入到主程序进程中的主界面容器中;接收用户通过嵌入到主界面容器中的集成界面执行的操作命令。具体地,上述将外部集成进程的集成界面嵌入到主程序进程中的主界面容器中可以优先通过以下方式实现上述处理过程外部集成进程通过调用Windows应用程序接口(API)设置父函数ktParent将所述集成界面嵌入到所述主界面容器中。具体地,HWNDWINAPISetParent(inHWNDhffndChild,in_optHWNDhffndNewParent);hffndChild(in)——子窗口句柄。本实施方式中为集成界面的句柄。hffndNewParent(in)——父窗口句柄。本实施方式中为主界面容器句柄。将当前窗口(即集成窗口)嵌入到CAD中的主界面容器内,可以采用以下程序行实现:01e32.SetParent(this.Hwnd,parentHwnd)(01e32为封装了许多WindowsAPI的一个类,包括ktParent。实际操作时可以不封装01e32这个类,或者可以封装其他类,如WindowAPIClass,但是一定是调用的ktParent这个WindowsAPI。)。当然还可以通过命令行参数获取CAD主程序进程中的主界面容器的窗口句柄,例如=IntPtrparentHwnd=IntPtr.Prase(strargs)。通过上述处理过程,可以实现将外部集成进程中的集成界面嵌入到主程序界面为集成提供的容器中,可以通过操作集成界面调用主程序进程执行与用户操作对应的功能。在将外部集成进程的集成界面嵌入到主程序进程中的主界面容器中之前,可以包括启动所述主程序进程,在主程序界面中加入所述集成界面容器,并将所述集成界面容器的句柄传输给所述外部集成进程。正如上面所述,可以通过命令行参数将上述窗口句柄传输给外部集成进程。在启动CAD主程序进程之后,还可以包括以下处理过程将集成插件加载至主程序进程,并在加载的集成插件中建立预先定义的CAD功能接口的实例;将实例作为运行对象表的ROT对象注册到ROT列表中。具体地,可以通过以下处理过程实现实例化一个CAD功能服务的实例;获取当前系统中的ROT对象表;将之前创建的CAD服务对象(即CAD功能接口的实例)注册到ROT表中。上述方法还可以包括以下处理过程响应用户通过主程序执行的指定操作,并将执行结果反馈给主程序。上述外部集成进程调用主程序进程执行与用户操作对应的功能,包括外部集成进程获取当前的ROT列表;外部集成进程遍历获取的ROT列表中的ROT对象并查询得到需要的ROT对象;外部集成进程通过查询得到的ROT对象调用主程序进程执行与用户操作对应的功能,以及通过查询得到的所述ROT对象响应所述主程序进程的指定操作,并向所述主程序进程反馈结果在本发明的一个优选实施方式中,上述主程序进程通过查询得到的所述ROT对象向所述外部集成进程发送消息或事件。实施例2在本实施例中还提供了一种CAD中外部集成进程调用主程序进程的装置,该装置用于实现上述实施例1及优选实施方式,已经进行过说明的不再赘述,下面对该装置中涉及到模块进行说明。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。图2是根据本发明实施例2的CAD中外部集成进程调用主程序进程的装置的结构框图。如图2所示,该装置包括启动模块20,用于启动CAD主程序进程;创建模块22,与启动模块20相连,用于为CAD主程序的集成应用创建一个与CAD主程序进程进行交互的独立运行的外部集成进程;调用执行模块24,与创建模块22相连,用于在外部集成进程响应于用户操作时,调用主程序进程执行与用户操作对应的功能。优选地,如图3所示,上述装置还可以包括嵌入模块26,与接收模块观相连,用于将外部集成进程的集成界面嵌入到主程序进程中的主界面容器中;接收模块观,与调用执行模块M相连,用于接收用户通过嵌入到主界面容器中的集成界面执行的操作命令’交互模块30,用于使所述外部集成进程响应用户通过主程序执行的指定操作,并将执行结果反馈给主程序。在本发明的一个优选实施方式中,上述启动模块20,还用于启动主程序进程中的主界面容器并将启动的主界面容器的窗口句柄传输给外部集成进程。在优选实施过程中,如图3所示,上述调用执行模块M还可以包括获取单元M0,用于获取当前的ROT列表;遍历查询单元M2,用于遍历获取的ROT列表中的ROT对象并查询得到需要的ROT对象;调用执行单元M4,用于通过查询得到的ROT对象调用主程序进程执行与用户操作对应的功能,以及通过查询得到的所述ROT对象响应所述主程序进程的指定操作,并向所述主程序进程反馈结果。实施例3本实施例的主要设计思想在于(1)在CAD集成环境中嵌入另一个进程的操作界面;(2)在相互隔离的进程中实现CAD和集成进程的双向交互。本实施例的CAD集成的进程隔离架构如图4所示,为了更好地理解图4,以下结合具体实例详细说明。如图4所示,当用户启动CAD程序时,通过CAD程序的插件机制加载Add^nCustomffnds组件,该组件在CAD程序的主界面框架中插入一个集成界面容器,插入集成菜单,并加载响应集成菜单事件的Add-hCommands组件。完成上述初始化后,根据当前CAD程序的类型,如CAXA工艺图表(CAPP)、CAXA电子图板(EB)、AutoCAD等,及其版本号(2011rl、2011r2)初始化针对该特定程序类型和版本“定制的”实现统一的ICADInterface接口的CAD服务的实例,即CADInterfaceImplement。将该实例以别名monikerName存入ROT中。然后,以集成界面容器的窗口句柄,以及CAD服务实例的别名作为参数启动Shell进程。Shell进程从启动参数中获取集成容器句柄,初始化集成界面并以ktParent方式将集成界面嵌入集成容器。同时,获取当前的EAPService版本,根据其版本初始化针对该版本“定制的”实现统一的IEAPhterface接口的EAP服务的实例,S卩EAPServiceImplement。从启动参数中获取CAD服务实例的别名,并遍历ROT获取别名为monikerName的CAD服务实例对象。以CAD服务实例对象及EAP服务实例对象作为参数初始化以单例模式封装的htegrationFacade实例,以该实例作为CAD集成与Shell集成交互的纽带。例如,用户在集成界面中右键某产品结构树中的某图纸,选择“打开图纸”菜单,菜单的响应方法调用htegrationFaade实例处理相应响应,IntegrationFaade实例调用EAP服务实例下载该图纸并返回其路径filename,CAD服务实例以filename为参数执行OpenFile方法在CAD程序中打开该图纸,实现CAD进程与Shell集成的交互访问。本实施例的具体实现过程如下步骤S302,抽象通用的CAD功能接口,并将其定义为标准COM接口形式,其中,在本发明实施例的一个优选实施方式中,可以采用以下伪代码实现[ComVisible(true),GuidAttribute("14C09983-FA4B-44e2-9910-6461728F7883"),InterfaceType(ComInterfaceType.InterfaceIsDual)]publicinterfaceICADInterface{voidOpenFile(stringfilename);[Displd(2)]voidCloseFilestringfilename();[DispIdPWvoidActiveFile(stringfilename);[Displd⑷]voidSaveFile(stringfilename);}步骤S304,CAD程序先加载集成插件,在插件中新建一个实现了上述CAD功能接口的实例,并将其注册到ROT列表中。其中,在本发明实施例的一个优选实施方式中,可以采用以下伪代码实现//实例化一个CAD功能服务的实例ICADInterfacecad=newCADInterface();//新建一个moniker对象,monikerName是rot对象的别名UCOMIMonikermoniker=01e32.CreateItemMoniker("",monikerName);//获取当前系统中的ROT对象表UCOMIRunningObjectTabletable=01e32.GetRunningObjectTable(O);//将之前创建的CAD服务对象注册表到ROT表中table.Register(0,cad,moniker,outregCookie);步骤S306,集成插件加载菜单和主界面容器,同时启动另一个外部进程Siell.exe,并将主界面容器的窗口句柄用命令函参数的方式传送给arell.exe进程。代码省略。步骤S308,在Siell.exe中,首先负责初始化和协同管理EAP平台相关的功能,然后通过ktParent方式将集成界面嵌入到CAD进程的主界面容器中。其中,在本发明实施例的一个优选实施方式中,可以采用以下伪代码实现//获取CAD进程中的主界面容器的窗口句柄(通过命令行参数)IntPtrparentHwnd=IntPtr.Prase(strargs);//将当前窗口(即集成窗口)嵌入到CAD中的主界面容器内01e32.SetParent(this.Hwnd,parentHwnd);步骤S310,当用户点击菜单或集成界面中的控件时,Shell,exe从ROT表中获取到CAD服务的实例,从而实现对CAD功能的跨进程调用。图5是根据本发明实施例3的CAD集成界面交互的示例图片,在图5中,左侧的“协同管理”侧边框为CAD程序为集成提供的主界面容器,图片左侧虚线框内的界面(即最左侧“协同管理”界面)为嵌入到容器中的集成界面。CDRAFT_M.exe为CAD程序进程,CAXA.A5.CADIntegration.Server.Shell,exe为Shell进程。当用户与上述图片左侧虚线框内的界面内控件进行交互时,CAXA.A5.CADIntegration.Server.Shell,exe从ROT中获取⑶RAFT_M.exe服务的实例,并调用该实例响应用户的操作,实现各种跨进程的CAD功能。其中,在本发明实施例的一个优选实施方式中,获取并调用ROT对象的过程可以采用如下伪代码实现ICADInterfacerot=null;UCOMIEnumMonikermonikerEnumerator;UCOMIMoniker口monikers=newUCOMIMoniker[l];stringrunningObjectName;//获取当前系统的ROT对象表UCOMIRunningObjectTablerunningObjectTable=Ole32.GetRunningObjectTable(0);runningObjectTable.EnumRunning(outmonikerEnumerator);monikerEnumerator.Reset();intnumFetched=0;//开始遍历列表中的所有ROT对象while(monikerEnumerator.Next(1,monikers,outnumFetched)==0){UCOMIBindCtxctx;ctx=01e32.CreateBindCtx(O);monikers.GetDisplayName(ctx,null,outrunningObjectName);//根据moniker名称来查找之前注册到ROT对象表中的远程对象if(runningObjectName==monikerName){objectrunningObjectVal;runningObjectTable.GetObject(monikers,outrunningObjectVal);IntPtrpUnk=Marshal.GetlUnknownForObject(runningObjectVal);IntPtrpIOle;Guidguid=Marshal.GenerateGuidForType(typeof(ICADInterface));MarshaLQueryInterface(pUnk,refguid,outpIOle);//得到匹配的ROT对象接口rot=Marshal.GetObjectForlUnknown(pIOle)asICADInterface;break;}}//通过获取到的ROT对象调用远程CAD的功能rot.OpenFile("C:\\test.exb");本实施例在开发CAXA协同管理与CAXA电子图板、电子图板工艺版等其他CAD软件集成时考虑到对集成的高可靠性和非破坏性的应用需求,通过将集成进程和CAD主进程隔离的方式,实现了CAD软件与集成应用间的双向交互,提高了整个CAD软件系统的安全性,也提供了更好的操作体验。具体地集成应用可以独立于CAD主程序的加载过程,从而提升了CAD主程序的启动速度;集成应用可以使用和CAD程序不同版本的组件进行开发而不用担心组件冲突,从而减少了集成开发的难度;集成应用即使崩溃也不会影响主程序,提高了CAD程序的稳定性。在另外一个实施例中,还提供了一种软件,该软件用于执行上述实施例及优选实施方式中描述的技术方案。在另外一个实施例中,还提供了一种存储介质,该存储介质中存储有上述软件,该存储介质包括但不限于光盘、软盘、硬盘、可擦写存储器等。显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。权利要求1.一种CAD中外部集成进程调用主程序进程的方法,其特征在于,包括启动CAD主程序进程;为CAD主程序的集成应用创建一个与所述CAD主程序进程进行交互的独立运行的外部集成进程;所述外部集成进程响应于用户操作,调用所述主程序进程执行与所述用户操作对应的功能。2.根据权利要求1所述的方法,其特征在于,所述外部集成进程响应于用户操作包括将所述外部集成进程的集成界面嵌入到所述主程序进程中的主界面容器中;接收用户通过嵌入到所述主界面容器中的所述集成界面执行的操作命令。3.根据权利要求2所述的方法,其特征在于,将所述外部集成进程的集成界面嵌入到所述主程序进程中的主界面容器中,包括所述外部集成进程通过调用Windows应用程序接口API中的设置父窗口函数SetParent将所述集成界面嵌入到所述主界面容器中。4.根据权利要求2所述的方法,其特征在于,将所述外部集成进程的集成界面嵌入到所述主程序进程中的主界面容器中之前,包括启动所述主程序进程,在主程序界面中加入所述集成界面容器,并将所述集成界面容器的句柄传输给所述外部集成进程。5.根据权利要求1所述的方法,其特征在于,启动CAD主程序进程之后,还包括将集成插件加载至所述主程序进程,并在加载的所述集成插件中建立预先定义的CAD功能接口的实例;将所述实例作为运行对象表的ROT对象注册到ROT列表中。6.根据权利要求1所述的方法,其特征在于,还包括响应用户通过主程序执行的指定操作,并将执行结果反馈给主程序。7.根据权利要求1至5任一项所述的方法,其特征在于,所述外部集成进程调用所述主程序进程执行与所述用户操作对应的功能,包括所述外部集成进程获取当前的ROT列表;所述外部集成进程遍历获取的所述ROT列表中的ROT对象并查询得到需要的ROT对象;所述外部集成进程通过查询得到的所述ROT对象调用所述主程序进程执行与所述用户操作对应的功能,以及通过查询得到的所述ROT对象响应所述主程序进程的指定操作,并向所述主程序进程反馈结果。8.根据权利要求7所述的方法,其特征在于,还包括所述主程序进程通过查询得到的所述ROT对象向所述外部集成进程发送消息或事件。9.一种CAD中外部集成进程调用主程序进程的装置,其特征在于,包括启动模块,用于启动CAD主程序进程;创建模块,用于为CAD主程序的集成应用创建一个与所述CAD主程序进程进行交互的独立运行的外部集成进程;调用执行模块,用于在所述外部集成进程响应于用户操作时,调用所述主程序进程执行与所述用户操作对应的功能。10.根据权利要求9所述的装置,其特征在于,还包括嵌入模块,用于将所述外部集成进程的集成界面嵌入到所述主程序进程中的主界面容器中;接收模块,用于接收用户通过嵌入到所述主界面容器中的所述集成界面执行的操作命令。全文摘要本发明提供了一种CAD中外部集成进程调用主程序进程的方法及装置,其中,上述方法包括启动CAD主程序进程;为CAD主程序的集成应用创建一个与CAD主程序进程进行交互的独立运行的外部集成进程;外部集成进程响应用户操作,调用主程序进程执行与用户操作对应的功能。采用本发明提供的上述技术方案,达到了提高CAD主程序的启动速度、减少集成开发难度以及提高了CAD程序的稳定性的效果。文档编号G06F9/46GK102426537SQ20111034180公开日2012年4月25日申请日期2011年11月2日优先权日2011年11月2日发明者倪永全,桓永兴,涂德海申请人:北京数码大方科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1