- UID
- 118401
- 积分
- 2156
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2004-3-28
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 Highflybird 于 2013-5-7 22:16 编辑
定制自己的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:
在用向导方式创建的这步,勾选自动化(Automation)
完成文件的创建之后,记得把arx工程所需要的库文件和包含文件加入进来。
并在stdafx.h文件的末尾添加如下头文件:
#include "arxHeaders.h" // 为objectARX应用添加
然后用向导方式创建一个MFC类。
这个类的名字叫CActTest,基类为CCmdTarget,在自动化(automation)中勾选可按类型ID创建(Createable by type ID)
然后按OK.
为这个类添加你自己定制的成员函数。我在这里定义了两个简单的函数,一个函数用对话框弹出你需要的文字(就像 Hello,world那样),另外的一个则是返回一个整数的平方。
这样函数申明和定义完成后,不要忘记在类实现文件(ActTest.cpp)中的这段中添加函数的引用。(//那一行处为添加部分)
如:showStr,MySquare。
BEGIN_DISPATCH_MAP(CActTest, CCmdTarget)
DISP_FUNCTION(CActTest, "ShowStr", ShowStr, VT_EMPTY, VTS_BSTR) //函数ShowStr的调用及其参数
DISP_FUNCTION(CActTest, "MySquare", MySquare, VT_I4, VTS_I4) //函数MySquare的调用及其参数
END_DISPATCH_MAP()
然后编译它,生成DLL文件,以供调用.
VLisp中的调用:
[pcode=lisp,true]
;;; 本程序演示了如何通过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 "\""))
)
[/pcode]VBA中的调用:
打开VBA编辑器,选择菜单的工具--引用,弹出对话框,点击浏览,选择你生成的DLL文件的目录,找到它,打开它并按下引用对话框的确定,
这样我们就可以再VBA中引用自己定义的ActiveX了.
定义一个过程,在编辑器中输入代码:
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中运行通过。
如果有什么问题,请看我下面的程序包。
顺便说一句,感觉到此类话题属于objectARX编程类,如有必要,请总版主移至其相应版块。
|
评分
-
参与人数 2 | D豆 +10 |
贡献 +2 |
收起
理由
|
xshrimp
| + 5 |
+ 1 |
很给力!经验;技术要点;资料分享奖! |
炫翔
| + 5 |
+ 1 |
很给力!经验;技术要点;资料分享奖! |
查看全部评分
|