马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
定制自己的ActiveX ,实现ARX和LISP,VBA的三方通信
ActiveX技术是微软组件化开发技术的基础,AutoCAD本身就是一个ActiveX自动化服务器,它提供了一系列的activeX对象.通过这些对象的属性和方法,VBA,VisualLisp就能控制autoCAD程序。
因此我们如果在开发的OjbectARX程序中实现ActiveX自动化,就可以实现Vlisp,VBA和ARX的三方的互相通信。在某些情况下,可以为我们带来很多便利。
譬如我们的核心数据处理(数值计算,等等)由arx开发,其他容易的代码则由vlisp或者VBA实现,这样我们可以达到高效和易用性的统一。
Vlisp和VBA可以调用arx定义的类和函数,并可以得到返回值,甚至可以调用其对话框资源,等等。
下面我抛砖引玉,通过这样的一个教程,演示如何实现这样的三方通信。
这个教程的大致流程如下: 由visual C++ 开发一个MFC DLL,并在其中建立一个类,定义了两个简单的函数,生成以供lisp和VBA调用。
首先创建一个MFC DLL工程,工程名为:MyActTest:
http://www.mjtd.com/bbs/showimg.asp?BoardID=3&fileid=47674
在用向导方式创建的这步,勾选自动化(Automation)
http://www.mjtd.com/bbs/showimg.asp?BoardID=3&fileid=47675
完成文件的创建之后,记得把arx工程所需要的库文件和包含文件加入进来。
并在stdafx.h文件的末尾添加如下头文件:
#include "arxHeaders.h" // 为objectARX应用添加
然后用向导方式创建一个MFC类。
http://www.mjtd.com/bbs/showimg.asp?BoardID=3&fileid=47676
这个类的名字叫CActTest,基类为CCmdTarget,在自动化(automation)中勾选可按类型ID创建(Createable by type ID)
然后按OK.
http://www.mjtd.com/bbs/showimg.asp?BoardID=3&fileid=47677
为这个类添加你自己定制的成员函数。我在这里定义了两个简单的函数,一个函数用对话框弹出你需要的文字(就像 Hello,world那样),另外的一个则是返回一个整数的平方。
http://www.mjtd.com/bbs/showimg.asp?BoardID=3&fileid=47678
这样函数申明和定义完成后,不要忘记在类实现文件(ActTest.cpp)中的这段中添加函数的引用。(//那一行处为添加部分)
如:showStr,MySquare。
- BEGIN_DISPATCH_MAP(CActTest, CCmdTarget)
- //函数ShowStr的调用及其参数
- DISP_FUNCTION(CActTest, "ShowStr", ShowStr, VT_EMPTY, VTS_BSTR)
- //函数MySquare的调用及其参数
- DISP_FUNCTION(CActTest, "MySquare", MySquare, VT_I4, VTS_I4)
- END_DISPATCH_MAP()
复制代码
在myacttest.idl中应该增加如下代码段(红色为增加部分)
- dispinterface IActTest
- {
- properties:
- methods:
- [color=red]
- [id(1)] void ShowStr(BSTR str);
- [id(2)] int MySquare(int x);
- [/color]
- };
复制代码
增加这个的目的是为了在VBA中能智能提示方法或者属性。
然后编译它,生成DLL文件,以供调用.
VLisp中的调用:
[php]
;;; 本程序演示了如何通过Activex来调用arx中的类(class)和函数。
;;; 程序先注册ActiveX,后创建一个object,用vlax-invoke-method
;;; 来调用其中的函数的功能,也可以通过它得到返回值。
;;; 程序未加出错判断,请自行加入。
;;; highflybird 2009-5-23 Haikou
(vl-load-com)
(defun c:test (/ obj)
(DllRegister "F:\\ZQY\\MyProject\\MyActTest\\Debug\\MyActTest.DLL")
; 也可以增加判断,如果注册了则无需再注册
(setq obj (vlax-create-object "MyActTest.ActTest"))
; 创建一个实例(对象)
(vlax-invoke-method obj 'ShowStr "highflybird")
; 调用其MyActTest中的函数
(print (vlax-invoke-method obj 'MySquare 12))
; 得到返回值
(vlax-release-object obj)
; 别忘记释放实例
(UnDllRegister "F:\\ZQY\\MyProject\\MyActivex\\Debug\\MyActTest.DLL")
; 反注册
(princ)
)
;;; DLL 的注册
(defun DLLRegister (dll)
(startapp "regsvr32.exe" (strcat "/s \"" dll "\""))
)
;;; DLL 的反注册
(defun UnDLLRegister (dll)
(startapp "regsvr32.exe" (strcat "/u /s \"" dll "\""))
)
[/php]
VBA中的调用:
打开VBA编辑器,选择菜单的工具--引用,弹出对话框,点击浏览,选择你生成的DLL文件的目录,找到它,打开它并按下引用对话框的确定,这样我们就可以再VBA中引用自己定义的ActiveX了.
http://www.mjtd.com/bbs/showimg.asp?BoardID=3&fileid=47679
http://www.mjtd.com/bbs/showimg.asp?BoardID=3&fileid=47680
定义一个过程,在编辑器中输入代码:
- Sub test()
- Dim obj As ActTest
- Set obj = New ActTest
- obj.ShowStr "hello,highflybird!"
- Set obj = Nothing
- End Sub
运行,就看到你出现的效果了。
本程序由Visual Studio 2002 + ObjectARX2006 + AutoCAD 2006开发,在AutoCAD2006中运行通过。
如果有什么问题,请看我下面的程序包。
另外由于不能上传图片(谁能帮忙一下?),请参考如下链接:
http://www.objectarx.net/bbs/vie ... &extra=page%3D1
http://www.mjtd.com/bbs/dispbbs. ... ID=75845&page=1 |