关于COM: 如何在 ActiveX DLL访问从 Visual LISP传入的Variant变量的问题

feifeima2008 feifeima2008 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位大侠,你们好
想请教一个问题:Vlisp 和Com (activeX)组件数据如何相互访问 ?

在autocad的开发工具中有Vlisp语言,该语言可以使用activeX组件,即在Vlisp中可以用
VLAX-CREATE-OBJECT,vlax-invoke使用其他的COM(ActiveX)组件,如下:
;;lisp program
(vl-load-com)
(defun c:test (/ obj)
(DllRegister "c:\\MyProject\\MyActivex\\Debug\\MyActTest.DLL") ; 也可以增加判断,如果注册了则无需再注册
(setq obj (vlax-create-object "MyActTest.ActTest")) ; 创建一个实例(对象)
(vlax-invoke-method obj 'ShowStr "highflybird") ; 调用其MyActTest中的函数 ,传入单个string
(print (vlax-invoke-method obj 'MySquare 12)) ; 得到返回值 ,传入int 参数
(vlax-release-object obj) ; 别忘记释放实例
(UnDllRegister "F:\\MyProject\\MyActivex\\Debug\\MyActTest.DLL") ; 反注册
(princ)
)

同时他还有vlax-make-safearray,vlax-safearray-fill,vlax-make-variant,
这些可以处理lisp的表(List),如果把表转化为安全数组SafeArray,或Variant,使用
vlax-invoke-method 传入Com(ActiveX)DLL内,却无法访问到数据内容。如下:

(vl-load-com)
(defun c:test (/ obj)
(DllRegister "c:\\MyProject\\MyActivex\\Debug\\MyActTest.DLL") ; 也可以增加判断,如果注册了则无需再注册
(setq obj (vlax-create-object "MyActTest.ActTest")) ; 创建一个实例(对象)

(setq list1 '(("BOM_UNITS" "ea") ("MATERIAL" "text1") ("NAME" "text2")))
(setq list2 (vlax-make-safearray vlax-vbString (cons 0 (1-(length list1)))(cons 0 1)))
(setq listSafe(vlax-safearray-fill list2 list1))
(setq listVariant(vlax-make-variant listSafe))
;;;; 问题1处:
(vlax-invoke-method obj 'ShowStr listVariant) ; 调用其MyActTest中的函数 ,测试传入varinat safearray,在Com内也无访问到正确的数据

(setq intVal (vlax-make-variant 12 vbInteger))
;;;; 问题2处:
(print (vlax-invoke-method obj 'MySquare intVal)) ; 测试传入varinat vbInteger,在Com内也无访问到正确的数据 ,传入int 参数
(vlax-release-object obj) ; 别忘记释放实例
(UnDllRegister "F:\\MyProject\\MyActivex\\Debug\\MyActTest.DLL") ; 反注册
(princ)
)

vc或vb的组件内代码如下:
// CActTest 消息处理程序

void CActTest::ShowStr(VARIANT varValue)
{
//在此处测试varValue.vt的类型全是VT_I4,此处访问varValue值
//接受数据
//AfxMessageBox(str);
return;
}



但如果在用vb写的 Com(ActiveX)DLL组件内(服务器端),使用variant做参数接受数据,如果在vc写的客户端
程序,如果要数组出入Com(ActiveX)DLL组件内(服务器端),此时只要把数组设计成safearray,
就可以传入到Com(ActiveX)DLL组件内,也就是在vb写Com(ActiveX)DLL组件内接受到vc过来的数据,即在
ShowStr(VARIANT varValue)的开始处,可以正确取出数据的类型。
因此,我的问题是,对(setq listSafe(vlax-safearray-fill list2 list1)),
(setq listSafe(vlax-safearray-fill list2 list1))和(setq listVariant(vlax-make-variant listSafe)) 中的
listSafe,listVariant在CActTest::ShowStr(VARIANT varValue)如何访问?也就是说在Lisp中vlax-make-safearray,和
vlax-Make-Variant这两个函数是和vc内createSafeArray不同的。

另外一问题:能帮我下载这个网页上的内容吗:
http://adn.autodesk.com/adn/servlet/devnote?siteID=4814862&id=5408565&linkID=4900509
或者找些关于COM: Using a ActiveX DLL from Visual LISP这方面的资料
...全文

相关推荐

五种VB与MATLAB混合编程接口的方法

MATLAB提供了ActiveX自动化服务,VB可以通过调用MATLAB引擎的ActiveX组件执行MATLAB命令,获取或设置MATLAB的矩阵变量,甚至控制MATLAB命令行窗口的显示状态。

君韬养晦

AutoCAD二次开发三剑客:LISP、VBA、ARX速查手册与避坑指南

CAD二次开发是提升设计效率与实现自动化出图的关键技术路径。面对AutoLISP、VBA与ObjectARX三套并行生态,开发者常因语法差异与接口记忆负担而陷入低效循环。理解三者原理:LISP以解释执行和灵活交互见长,适合快速验证与批量处理;VBA依托ActiveX与Office互通,是跨软件数据流转的利器;ARX基于C++原生编译,性能与定制能力最强,但环境配置复杂。从技术价值看,掌握三者的协同策略,可覆盖从轻量脚本到重型插件的完整需求。在工程实践中,批量参数化建模、Excel联动绘图、自定义实体等典型场

weixin_34348805

化工CAD插件深度解析:LISP+ARX+数据库协同架构

AutoCAD插件是工程设计中提升效率的关键技术载体,其本质是通过脚本(LISP)、动态库(ARX)与外部数据源的协同,将行业规范转化为可执行逻辑。理解插件运行原理,需从AutoCAD二次开发基础出发:LISP负责规则翻译与交互控制,ARX承担高性能几何计算与API调用,而外部数据库则作为设计标准的‘活字典’,支撑材质、编码、图例等动态映射。这种三层架构显著降低人工校验错误率,广泛应用于化工PID校核、管道轴测图生成、设备布置智能标注等典型场景。本文聚焦HGCAD2.6.3插件体系,深入剖析LISP逻辑封装

weixin_34128839

AutoCAD二次开发教程复习总结借鉴.pdf

ActiveX Automation:通过COM接口与AutoCAD进行交互,适合那些已经熟悉COM编程的开发者。8.

gy51338424

解析AutoCAD软件道路断面图绘制技术.pdf

2) ActiveX Automation:基于COM组件对象模型,允许一个应用程序控制另一个应用程序,这使得用户能够轻松地添加自定义功能到AutoCAD中。

hhappy0123456789
评论
收藏 已收藏
分享
返回顶部
feifeima2008
ATL 3,248 成员 48,530 内容