找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3185|回复: 5

[原创]:定制自己的ActiveX ,实现ARX和LISP,VBA的三方通信

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2009-5-24 22:25:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
定制自己的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。

  1. BEGIN_DISPATCH_MAP(CActTest, CCmdTarget)
  2.     //函数ShowStr的调用及其参数
  3.     DISP_FUNCTION(CActTest, "ShowStr", ShowStr, VT_EMPTY, VTS_BSTR)
  4.     //函数MySquare的调用及其参数   
  5.     DISP_FUNCTION(CActTest, "MySquare", MySquare, VT_I4, VTS_I4)  
  6. END_DISPATCH_MAP()
复制代码

在myacttest.idl中应该增加如下代码段(红色为增加部分)

  1. dispinterface IActTest
  2. {
  3.     properties:
  4.     methods:
  5.       [color=red]
  6.        [id(1)] void ShowStr(BSTR str);
  7.        [id(2)] int MySquare(int x);
  8.      [/color]
  9. };

复制代码

增加这个的目的是为了在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
定义一个过程,在编辑器中输入代码:

  1. Sub test()
  2.     Dim obj As ActTest
  3.     Set obj = New ActTest
  4.     obj.ShowStr "hello,highflybird!"
  5.     Set obj = Nothing
  6. 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

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2009-5-26 19:42:57 | 显示全部楼层
好贴!

感谢Hightflybird!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-6-10 09:24:55 | 显示全部楼层
高手啊,学习中!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 305个

财富等级: 日进斗金

发表于 2014-4-8 15:55:56 | 显示全部楼层
后知后觉,来晚了:Q
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 117个

财富等级: 日进斗金

发表于 2014-7-4 09:35:50 | 显示全部楼层
高手啊,学习中!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-12-7 12:39:51 | 显示全部楼层
实现arx 和lisp,vba三方通信 此文程序包能发我一份吗? oshan2008@126.com  或 879626793@qq.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-26 21:49 , Processed in 0.391507 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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