首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

关于Vlisp 和Com (activeX)组件数据怎么相互访问

2012-12-17 
关于Vlisp 和Com (activeX)组件数据如何相互访问那位大侠,你好想请教你一个问题:Vlisp 和Com (activeX)组

关于Vlisp 和Com (activeX)组件数据如何相互访问
那位大侠,你好

   想请教你一个问题: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这方面的资料
[解决办法]
或许是你构造的 safearray 过于复杂,里面用了lisp的表来作为数组元素,所以非lisp的应用不认识。

你不如构造一个简单一点的safearray传进去试试:
(setq listSafe (vlax-make-safearray vlax-vbdouble '(0 . 2)))
(vlax-safearray-fill listSafe '(1 2 3))
(setq listVariant(vlax-make-variant listSafe))
(vlax-invoke-method obj 'ShowStr listVariant)

热点排行
Bad Request.