当多个CATIA会话打开时,GetObject返回第一个会话。是否有可能针对特定的会话CATIA会话?我注意到,当外部程序通过COM访问CATIA或打开CATIA的内部VBA编辑器时,子进程(CATVBAHostingApplication.exe)将启动并保持打开状态。如果不终止此进程,则无法从第二个CATIA进程访问VBA编辑器。有人能解释CATVBAHostingApplication.exe如何与CATIA交互,以及它是否可以被操纵来针对特定的实例吗?
发布于 2014-11-14 18:41:39
您可以针对CATIA的特定实例,但您必须使用程序ID号和一些巧妙的编码。你在用什么语言?你是从哪个项目工作的?你是在制作一个独立的EXE或控制台应用程序吗?
坦率地说,我已经编写了一些子程序来解析正在运行的应用程序列表并获取这些信息,但是这是一个痛苦的过程。与访问Excel的多个实例时一样,您使用打开的文件名(如Excel中的工作簿)通过GetObject访问。但首先,您需要执行我前面提到的解析。
一种简单得多的方法:每当我需要同时打开多个Catia实例时,我就使用CreateObject而不是GetObject,并让我的外部程序启动我的所有实例。
坦率地说,CATVBAHostingApplication.exe是在64位CATIA版本中维护VBA的一个草率的解决方案。32位CATIA的VBA曾经是一件很棒的事情。超快,没有刷新所有的时间,等等。一旦64位出现,达索不知道如何处理VBA附件。所以他们让这个CATVBAHostingApplication.exe沿着CATIA运行,它速度慢,不必要地刷新CATIA显示,并且有很多bug。即使您杀死了CATIA,运行CATVBAHostingApplication.exe也并不少见,而且当您重新打开时,旧会话仍然保留着您的CATVBA文件。我可能每天至少从任务管理器中杀死CATVBAHostingApplication.exe三次。
每当您启动某种API时,无论是通过ALT+F8或ALT+F11在CATIA内部,还是通过COM连接,只要您喜欢与否,都会启动此过程。没有解决办法。我已经以编程的方式使用了前面提到的类似方法来解析任务列表,如果有必要的话,使用TaskKill来停止CATVBAHostingApplication.exe。但是在大多数情况下,如果我是通过COM连接的,那么在下次他们重新启动Windows之前,客户端是否正在运行并不重要。他们通常不会在VBA中编程,只是使用我的插件和手工建模。
最后,我不知道你为什么要连接到CATVBAHostingApplication.exe (根据我在你的文章中看到的),你不应该直接连接到CATIA吗?如果您已经加载了CATIA的引用,那么您不需要连接到VBA编辑器?也许我是误会了。HTH
https://stackoverflow.com/questions/26934746
复制相似问题