明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4857|回复: 11

请教高手,当同时运行了多个 AutoCAD 进程,如果获取指定的运行实例?

  [复制链接]
发表于 2009-9-29 10:15:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-9-29 10:46:25 编辑

详细说明:比如当前有2个AutoCAD进程正在运行,当我调用

 ::CLSIDFromProgID(L"AutoCAD.Application",&clsid); 

HRESULT hr = ::GetActiveObject(clsid,0,&m_pUnk);时,m_pUnk总是指向最先启动的那个CAD进程。

VBA的帮助文档是这样说的(当同时运行了多个 AutoCAD 进程, GetObject 函数返回Windows 运行对象表中第一个 AutoCAD 实例。请查阅 Microsoft Visual Basic 文档的  Running Object Table (ROT) 和 GetObject 函数 (以获得确认GetObject返回操作的详细信息))。

请教高手,有没有碰到过这个问题啊?如何解决呢?先谢谢啦!

 楼主| 发表于 2009-9-29 17:09:00 | 显示全部楼层

高手能否给点提示啊?不论用什么方法只要能关联起来就行了。

发表于 2009-10-6 08:40:00 | 显示全部楼层
试一下指定各文件的名字,使用时激活。
 楼主| 发表于 2009-10-12 10:58:00 | 显示全部楼层

多谢回答,楼上的方法不能解决以下情况哦。如:有两个进程都打开了同一个文件,这个时候怎么区分呢?
??

发表于 2009-10-13 14:43:00 | 显示全部楼层

如果从别的程序里调用getobject,可能只能得到第一个,但VLISP中,可以用(vlax-get-acad-object)来取得自身的acadapp对象,在vb中,如果你将vb作成一个activexdll,就可以将此对象以byval的方式传递给VB,VB就可以使用该acadapp对象了。其它语言我也不懂,但应该都可以传递。

 楼主| 发表于 2009-10-15 10:35:00 | 显示全部楼层

多谢楼上回复,使用VB来实现,确实是可行的。因为我们开发的项目是用VC的,唉,如果因为这个问题就要全部转成VB的话,太麻烦了。如果有什么方案能像楼上说的那样,把acadapp对象传递过来的话,就好了。

发表于 2009-10-16 08:06:00 | 显示全部楼层

其实我觉得,如果VC的程序是在AutoCAD外部执行的话,那应该跟使用哪个CAD没有关系,但如果在CAD的内部运行,那就可以找到运行命令的那个CAD的窗口,VC应该也有DLL的,也应该可以传递,但C我没有学过(其实是没有办法学会),所以也不太清楚。便看那些ARX程序,都是在各自的CAD里面运行的。

发表于 2009-10-18 23:43:00 | 显示全部楼层

英雄无敌说的有道理, 我也曾受此问题困惑.

 楼主| 发表于 2009-10-19 10:14:00 | 显示全部楼层
英雄无敌发表于2009-10-16 8:06:00其实我觉得,如果VC的程序是在AutoCAD外部执行的话,那应该跟使用哪个CAD没有关系,但如果在CAD的内部运行,那就可以找到运行命令的那个CAD的窗口,VC应该也有DLL的,也应该可以传递,但C我没有

再次感谢英雄无敌的关注,最近忙项目的其它功能去了。现在就等解决这个问题啊。

1、还是有关系的啵,比如有时用户在CAD进程ID为1111的CAD程序中点击我自定义的菜单,然后调用我的程序,但是发现操作后的结果跑到另一个进程中去了,这样对用户可能感觉有点奇怪,以为程序出错了。

2、我这个程序主要就是不在CAD内部运行的了,所以才会引出这个问题了。

3、听楼上的意思,对这个问题有过一番研究,能否给些指点。多谢!

发表于 2009-10-21 21:37:00 | 显示全部楼层

这就要看你程序运行的机理是什么了,如果程序是用GETOBJECT来取得CAD的应用程序对象的话,这个问题可能是无法解决的,或者我们不知道如何去解决的,但如果你用VC做的程序并不是ARX,那你可能也不能用SENDCOMMAND来发送命令,因为这样就有可能发送到错误的CAD窗口,

但有很多时候,我们用VB或是VC,只是想要它的对话框功能,具体完全可以用VLISP来完成,我一般是用VB做对话框界面,将参数传递给VLISP,来完成相应的功能,(其实VLISP除了不能定义实体外,其他的功能也是很强大的),

但里面也有问题,就是如何加载的问题,我利用了mtexted这个变量,下面是VLISP程序

(Defun Settmptxted(apppath /  tmptxt)
     (Setvar "cmdecho" 0)

     (If (makeatmpmtext)
     (Setq tmptxt (entlast))
     )
     (If (SSget "i")
;(Command"erase" "u" "")
(sssetfirst nil nil)
)
     (Setq *oldtxtedit* (getvar"mtexted"))
     (Setvar "mtexted" apppath)
     (Command"ddedit" tmptxt)
     (Setvar "mtexted"  *oldtxtedit*)
     (Command)
     (If tmptxt (Entdel tmptxt))
)
命令运行:

(defun c:rou ()
  (if (= nil hloadmmlsp)
    (loadmmlsp)
  )
  (getdwgname)
  (setq filn "c:\\mxb\\rough.lsp");路径可以自己设定,rough.exe生成lsp文件时,应使用此路径
  (princ "\n正在启动粗糙度生成器,请稍候...")
  (princ)
  (settmptxted "c:\\vbcad\\rough.exe");rough。exe是我用VB做的程序,做成模式窗口时,利用了COMMANDDILOG这个API,本来开始用MESSAGEBOX的,但它会嘟一声,没办法改的。
  (if (= "bad" (load filn "bad"))
    (alert "VBCAD已经损坏,请重新安装!\n如果没有关闭VBCAD,请先关闭!")
  ;(delf filn);删除的时候有点慢,干脆不删
  )
  (princ)
)

当然,这是在R14时代的程序,现在用VB不用这么麻烦了,直接做ACTIVEX DLL就行了。不过在不能用ACTIVEX DLL的时候,这个问题可真是个大问题。

VC做模式窗口可能比VB要容易,你会VC,不知道上面的思路能不给你一点提示。反正我以前就是这么干的,现在也还在用这么干做的程序,我也懒得去转成DLL版的。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 00:53 , Processed in 0.181876 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表