请教高手,当同时运行了多个 AutoCAD 进程,如果获取指定的运行实例?
本帖最后由 作者 于 2009-9-29 10:46:25 编辑 <br /><br /> <p>详细说明:比如当前有2个AUTOCAD进程正在运行,当我调用</p><p> ::CLSIDFromProgID(L"AutoCAD.Application",&clsid); </p><p>HRESULT hr = ::GetActiveObject(clsid,0,&m_pUnk);时,m_pUnk总是指向最先启动的那个CAD进程。</p><p>VBA的帮助文档是这样说的(当同时运行了多个 AutoCAD 进程, GetObject 函数返回Windows 运行对象表中第一个 AutoCAD 实例。请查阅 Microsoft Visual Basic 文档的 Running Object Table (ROT) 和 GetObject 函数 (以获得确认GetObject返回操作的详细信息))。</p><p>请教高手,有没有碰到过这个问题啊?如何解决呢?先谢谢啦!</p><p></p><p></p><p></p> <p>高手能否给点提示啊?不论用什么方法只要能关联起来就行了。</p> 试一下指定各文件的名字,使用时激活。 <p>多谢回答,楼上的方法不能解决以下情况哦。如:有两个进程都打开了同一个文件,这个时候怎么区分呢?<br/>??</p> <p>如果从别的程序里调用getobject,可能只能得到第一个,但VLISP中,可以用(vlax-get-acad-object)来取得自身的acadapp对象,在vb中,如果你将vb作成一个activexdll,就可以将此对象以byval的方式传递给VB,VB就可以使用该acadapp对象了。其它语言我也不懂,但应该都可以传递。</p> <p>多谢楼上回复,使用VB来实现,确实是可行的。因为我们开发的项目是用VC的,唉,如果因为这个问题就要全部转成VB的话,太麻烦了。如果有什么方案能像楼上说的那样,把acadapp对象传递过来的话,就好了。</p> <p>其实我觉得,如果VC的程序是在AutoCAD外部执行的话,那应该跟使用哪个CAD没有关系,但如果在CAD的内部运行,那就可以找到运行命令的那个CAD的窗口,VC应该也有DLL的,也应该可以传递,但C我没有学过(其实是没有办法学会),所以也不太清楚。便看那些ARX程序,都是在各自的CAD里面运行的。</p> <p>英雄无敌说的有道理, 我也曾受此问题困惑.</p> 英雄无敌发表于2009-10-16 8:06:00static/image/common/back.gif其实我觉得,如果VC的程序是在AutoCAD外部执行的话,那应该跟使用哪个CAD没有关系,但如果在CAD的内部运行,那就可以找到运行命令的那个CAD的窗口,VC应该也有DLL的,也应该可以传递,但C我没有<p>再次感谢英雄无敌的关注,最近忙项目的其它功能去了。现在就等解决这个问题啊。 </p><p>1、还是有关系的啵,比如有时用户在CAD进程ID为1111的CAD程序中点击我自定义的菜单,然后调用我的程序,但是发现操作后的结果跑到另一个进程中去了,这样对用户可能感觉有点奇怪,以为程序出错了。 </p><p>2、我这个程序主要就是不在CAD内部运行的了,所以才会引出这个问题了。 </p><p>3、听楼上的意思,对这个问题有过一番研究,能否给些指点。多谢!</p> <p>这就要看你程序运行的机理是什么了,如果程序是用GETOBJECT来取得CAD的应用程序对象的话,这个问题可能是无法解决的,或者我们不知道如何去解决的,但如果你用VC做的程序并不是ARX,那你可能也不能用SENDCOMMAND来发送命令,因为这样就有可能发送到错误的CAD窗口,</p><p>但有很多时候,我们用VB或是VC,只是想要它的对话框功能,具体完全可以用VLISP来完成,我一般是用VB做对话框界面,将参数传递给VLISP,来完成相应的功能,(其实VLISP除了不能定义实体外,其他的功能也是很强大的),</p><p>但里面也有问题,就是如何加载的问题,我利用了mtexted这个变量,下面是VLISP程序</p><p>(Defun Settmptxted(apppath / tmptxt)<br/> (Setvar "cmdecho" 0)</p><p> (If (makeatmpmtext)<br/> (Setq tmptxt (entlast))<br/> )<br/> (If (SSget "i")<br/>;(Command"erase" "u" "")<br/>(sssetfirst nil nil)<br/>)<br/> (Setq *oldtxtedit* (getvar"mtexted"))<br/> (Setvar "mtexted" apppath)<br/> (Command"ddedit" tmptxt)<br/> (Setvar "mtexted" *oldtxtedit*)<br/> (Command)<br/> (If tmptxt (Entdel tmptxt))<br/>)<br/>命令运行:</p><p>(defun c:rou ()<br/> (if (= nil hloadmmlsp)<br/> (loadmmlsp)<br/> )<br/> (getdwgname)<br/> (setq filn "c:\\mxb\\rough.lsp");路径可以自己设定,rough.exe生成lsp文件时,应使用此路径<br/> (princ "\n正在启动粗糙度生成器,请稍候...")<br/> (princ)<br/> (settmptxted "c:\\vbcad\\rough.exe");rough。exe是我用VB做的程序,做成模式窗口时,利用了COMMANDDILOG这个API,本来开始用MESSAGEBOX的,但它会嘟一声,没办法改的。<br/> (if (= "bad" (load filn "bad"))<br/> (alert "VBCAD已经损坏,请重新安装!\n如果没有关闭VBCAD,请先关闭!")<br/> ;(delf filn);删除的时候有点慢,干脆不删<br/> )<br/> (princ)<br/>)</p><p>当然,这是在R14时代的程序,现在用VB不用这么麻烦了,直接做ACTIVEX DLL就行了。不过在不能用ACTIVEX DLL的时候,这个问题可真是个大问题。</p><p>VC做模式窗口可能比VB要容易,你会VC,不知道上面的思路能不给你一点提示。反正我以前就是这么干的,现在也还在用这么干做的程序,我也懒得去转成DLL版的。<br/></p>
页:
[1]
2