搜索
查看: 1274|回复: 3

怎么获取com组件里成员函数列表?

[复制链接]

34

主题

163

帖子

938

积分

荣誉会员

吃白菜的鸟

Rank: 8Rank: 8

积分
938
发表于 2017-10-18 16:46:48 | 显示全部楼层 |阅读模式
如题:
对com组件的使用不熟悉.
最近用到一个dll是vb6写的com组件,要注册组件才能使用的那种.
求问,怎么实现获取到这个dll里面的所有对外函数?

首先: 我用com自带的,com.DumpTypeInfo(obj)是可以获取到所有函数,但是我想获取这个函数列表到一个listbox,或者edit中,不知道这个怎么做?
不知道DumpTypeInfo()这个函数是怎么执行输出到控制台的?

其次: 我下面实验了好多个com函数,都没发现这个函数列表应该怎么弄......



  1. import win.ui;
  2. /*DSG{{*/
  3. mainForm = win.form(text="aardio form";right=759;bottom=469)
  4. mainForm.add()
  5. /*}}*/

  6. import console;
  7. import com;
  8. import com.lite;

  9. console.open();



  10. var getString = function( tab ){
  11.         var strResult = ..table.tostring(tab);
  12.         strResult = string.replace(strResult,";",';\r\n');
  13.         strResult = string.replace(strResult,"\{ *",'{\r\n');
  14.         strResult = string.replace(strResult,"\}",'\r\n}');
  15.        
  16.         strResult = string.trim(strResult,"{}");//去掉首尾的构造符
  17.         return strResult;
  18. }

  19. var obj = com.CreateObject("Z_WDM.WDM" );
  20.         assert(obj,"创建com对象失败");
  21.         //获取函数列表
  22.         com.DumpTypeInfo(obj)
  23.        
  24.         var typeinfo = com.GetTypeInfo(obj)
  25.         //获取文档信息
  26.         console.varDump(
  27.                 typeinfo.GetDocumentation()
  28.         )
  29.         //获取类型属性
  30.         console.varDump(
  31.                 typeinfo.GetTypeAttr()
  32.         )
  33.         //获取类型库
  34.         console.varDump(
  35.                 typeinfo.GetTypeLib()
  36.         )
  37.         //导出常量
  38.         console.varDump(
  39.                 typeinfo.GetTypeLib().ExportConstants()
  40.         )
  41.         //导出全部迭代器
  42.         console.varDump(
  43.                 typeinfo.GetTypeLib().ExportEnumerations()
  44.         )
  45.         //导出类型计数
  46.         console.varDump(
  47.                 typeinfo.GetTypeLib().GetTypeInfoCount()
  48.         )
  49.        
  50.         console.log(".............下面做一些直接操作组件变量的实验............")
  51.         //获取
  52.         console.log(obj.负限位)

  53.         console.varDump(
  54.                 com.GetIUnknown(obj)
  55.         )

  56. mainForm.enableDpiScaling();
  57. mainForm.show();

  58. return win.loopMessage();
复制代码


图中的编码是乱码, 貌似因为这个dll的函数中文名的原因,晕了.
附上工程打包: http://pan.baidu.com/s/1bpfJ8Bl
回复

使用道具 举报

34

主题

163

帖子

938

积分

荣誉会员

吃白菜的鸟

Rank: 8Rank: 8

积分
938
 楼主| 发表于 2017-10-18 16:50:26 | 显示全部楼层
本来用com.lite免注册调用的,发现貌似不行
后来直接手工注册的, 应该只注册Z_WDM.dll就可以了, 我手工所有的都注册了下..汗
回复

使用道具 举报

159

主题

2466

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13547
发表于 2017-10-18 16:59:21 | 显示全部楼层
popdes 发表于 2017-10-18 16:50
本来用com.lite免注册调用的,发现貌似不行
后来直接手工注册的, 应该只注册Z_WDM.dll就可以了, 我手工所有 ...


一般的控件用 com.activeX.regsvr32() 注册就可以,
有些需要管理权限的 用 com.activeX.regsvr32As()

VB的控件可能有些麻烦,依赖的东西可能会很多,一个控件依赖另一个。
一般VB写的控件尽量不要用,用VC写的会好些。
回复

使用道具 举报

34

主题

163

帖子

938

积分

荣誉会员

吃白菜的鸟

Rank: 8Rank: 8

积分
938
 楼主| 发表于 2017-12-8 23:16:23 | 显示全部楼层
搞定了, 感谢群里: 王港 kio1 codex 阿法牛 indertust ...等人对我的指导!

我这里写了个简单的示例, 将com组价的函数直接输出到edit里:
其实,com库里已经封装了很完整的源码了, 只需要各种调用就可以了. 谢谢校长提供这么好的库.

1512745919614657.png

  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="COM组件函数查看演示";right=759;bottom=455;border="dialog frame")
  4. winform.add(
  5. button={cls="button";text="查看该组件内置函数";left=566;top=419;right=756;bottom=450;z=3};
  6. comEdit={cls="edit";text="ADODB.Connection";left=318;top=419;right=545;bottom=448;align="center";bgcolor=0;color=65280;edge=1;font=LOGFONT(h=-16);z=2};
  7. funcEdit={cls="edit";left=5;top=4;right=756;bottom=416;bgcolor=0;color=65280;font=LOGFONT(name='微软雅黑';h=-14);hscroll=1;multiline=1;readonly=1;vscroll=1;z=1}
  8. )
  9. /*}}*/

  10. var loadFunc = function( comMsg ){
  11.         import com;
  12.         //调用COM组件
  13.         obj = com.CreateObject( comMsg );
  14.         //获取COM组件类型库信息
  15.         var typeinfo = com.GetTypeInfo(obj)
  16.         //准备存储获取到的类型库信息
  17.         var funcTab = {};
  18.         //下面直接调用函数总数目不准确,因为有写com组件里有空函数
  19.         //winform.funcEdit.log("共有函数: "++typeinfo.GetTypeAttr().Funcs ++ " 个!",'\r\n');
  20.         for(i=0;typeinfo.GetTypeAttr().Funcs-1;1){
  21.             table.push(funcTab,table.clone(typeinfo.GetFuncDesc(i) ));
  22.         }
  23.         for(i=1;#funcTab;1){
  24.              var funcPara = null;//参数合成
  25.                 if(funcTab[ i ].Params != null){
  26.                         //console.dump(funcTab[ i ]);
  27.                         //总共几个变量参数
  28.                         for(j=1;funcTab[ i ].Params;1){
  29.                                 var parametersTab = (funcTab[ i ].parameters)[j];
  30.                                 if( parametersTab != null ){
  31.                                         //console.dump(parametersTab);
  32.                                         if(j==1){
  33.                                                 funcPara = string.concat(funcPara,parametersTab._com_type," ",parametersTab.name);
  34.                                         }else {
  35.                                                 funcPara = string.concat(funcPara,',',parametersTab._com_type," ",parametersTab.name);
  36.                                         }
  37.                                        
  38.                                 }
  39.                        
  40.                         }
  41.                         //输出
  42.                         winform.funcEdit.log(string.concat(funcTab[ i ]._com_type ," ",funcTab[ i ].name ,"( ",funcPara , " );"),'\r\n');
  43.                        
  44.                 }
  45.        
  46.         }
  47. }
  48.    
  49.         
  50. winform.button.oncommand = function(id,event){
  51.        
  52.         winform.funcEdit.clear();
  53.         loadFunc(winform.comEdit.text);
  54.        
  55. }






  56. winform.show()
  57. win.loopMessage();
复制代码
!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-6-21 19:57 , Processed in 0.109375 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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