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

feifeima2008 2010-07-15 06:43:15
各位大侠,你们好
想请教一个问题: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这方面的资料
...全文
175 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧