输出COM对象类型信息(从临时文件读取)

By admin at 2017-12-07 • 0人收藏 • 451人看过
//输出COM对象类型信息
import com;
import console
var fs = com.CreateObject("Scripting.FileSystemObject")
//输出com对象成员
dumpObject = function(obj) {
    var t = {};
    var file = io.tmpname();
    io.stdout.reopen(file, "w+t");
    com.DumpTypeInfo(fs)
    io.stdout.reopen("CONOUT$", "w+t")
    for line in io.lines(file) {
        var pattern = "(.+)\:\s(.+)";
        for k, v in string.gmatch(string.trim(line), pattern) {
            t[k] = string.trim(v)
        }
    }
    return t;
}
obj = dumpObject(fs);
console.dump(obj)
console.pause()

感谢群里: CodeX 分享.

这样得到数据表之后,就可以想给谁显示就给谁.

6 个回复 | 最后更新于 2018-04-04
2017-12-08   #1

感谢群成员: 王港 提供以下方式:

import console; 
import win.guid
import process;
import com;
var hwnd = 131866;   //自己改qq句柄
io.open();
var dll = ..raw.loadDll("OLEACC.DLL");
var AccessibleObjectFromWindow = dll.api("AccessibleObjectFromWindow","int(int hwnd,INT dwObjectID,struct riid,pointer &ppvObject)" );
var IID_IAccessible = ..win.guid.fromString("{618736E0-3C3D-11CF-810C-00AA00389B71}");
var hr,pObject = AccessibleObjectFromWindow(hwnd,0xFFFFFFFC/*0xFFFFFFFC_OBJID_CLIENT*/, IID_IAccessible,pObject);
var object = com.QueryObject( pObject );

//================================================
var ret,ptr_interface=AccessibleObjectFromWindow(hwnd,0xFFFFFFFC/*_OBJID_CLIENT*/,IID_IAccessible,);
var obj_pro=process();
//=================================================调用GetIDsOfNames方法获取accName成员id
var fun_addr=raw.convert(topointer(raw.convert(ptr_interface,{addr val}).val+20),{addr val}).val;
var GetIDsOfNames=obj_pro.remoteApi("int(ptr thisAddr,ptr riid,ptr rgszNames,INT arr_len,int flag,ptr dispid)",fun_addr)
var dispid=raw.malloc(12);
var str_tab={string str[]={string.fromto("accName",,1200);string.fromto("varChild",,1200);string.fromto("pszName",,1200)}};
var hret=GetIDsOfNames(ptr_interface,null,raw.malloc(str_tab),1,0x400,dispid);
io.print("hret,dispid",hret,topointer(hret),string.join(raw.convert(dispid,{INT arr[3]={}}).arr," "));
io.print(tostring(raw.convert(dispid,{INT arr[3]={}}).arr[1],16))  //0xffffec75
//========================================================调用GetTypeInfoCount方法
var fun_addr=raw.convert(topointer(raw.convert(ptr_interface,{addr val}).val+12),{addr val}).val;
var GetTypeInfoCount=obj_pro.remoteApi("int(ptr,ptr)",fun_addr)
var count=raw.malloc(4);
var hret=GetTypeInfoCount(ptr_interface,count);
io.print("hret,count",hret,count,raw.convert(count,{INT val}).val) 
//========================================================调用GetTypeInfo方法
var fun_addr=raw.convert(topointer(raw.convert(ptr_interface,{addr val}).val+16),{addr val}).val;
var GetTypeInfo=obj_pro.remoteApi("int(ptr,int,int,ptr&)",fun_addr)
var hret,ppTypeInfo=GetTypeInfo(ptr_interface,0,0x400,);
io.print("hret,ppTypeInfo",hret,ppTypeInfo,tostring(raw.convert(ppTypeInfo,{INT val}).val,16)) 
//======================================================调用GetTypeAttr方法
var fun_addr=raw.convert(topointer(raw.convert(ppTypeInfo,{addr val}).val+12),{addr val}).val;
var GetTypeAttr=obj_pro.remoteApi("int(ptr,ptr&)",fun_addr)
var hret,ppTypeAttr=GetTypeAttr(ppTypeInfo,);
io.print("hret,ppTypeAttr",hret,ppTypeAttr,tostring(raw.convert(ppTypeAttr,{INT val}).val,16)) 
//=======================================================



//======================================================		
console.pause(true);

从中学到了很多以前没用过的只是,再次感谢!

2017-12-08   #2

通过GetFuncDesc()函数获取函数列表和函数参数:

import console; 
//获取com对象成员列表 

import com;
import console;

console.open();
obj = com.CreateObject("Z_WDM.WDM"); 

var typeinfo = com.GetTypeInfo(obj)


	console.log("共有函数: "++typeinfo.GetTypeAttr().Funcs ++ " 个");

	for(i=0;typeinfo.GetTypeAttr().Funcs-1;1){
		
		console.dump( typeinfo.GetFuncDesc(i) );
		
	}
		

//com.DumpTypeInfo(obj) //输出所有成员

console.pause(true);


2017-12-08   #3
 import console; 
import win.guid
import process;
import com;
var hwnd = 131866;   //自己改qq句柄
io.open();
var dll = ..raw.loadDll("OLEACC.DLL");
var AccessibleObjectFromWindow = dll.api("AccessibleObjectFromWindow","int(int hwnd,INT dwObjectID,struct riid,pointer &ppvObject)" );
var IID_IAccessible = ..win.guid.fromString("{618736E0-3C3D-11CF-810C-00AA00389B71}");
var hr,pObject = AccessibleObjectFromWindow(hwnd,0xFFFFFFFC/*0xFFFFFFFC_OBJID_CLIENT*/, IID_IAccessible,pObject);
var object = com.QueryObject( pObject );

//================================================
var ret,ptr_interface=AccessibleObjectFromWindow(hwnd,0xFFFFFFFC/*_OBJID_CLIENT*/,IID_IAccessible,);
var obj_pro=process();
//=================================================调用GetIDsOfNames方法获取accName成员id
var fun_addr=raw.convert(topointer(raw.convert(ptr_interface,{addr val}).val+20),{addr val}).val;
var GetIDsOfNames=obj_pro.remoteApi("int(ptr thisAddr,ptr riid,ptr rgszNames,INT arr_len,int flag,ptr dispid)",fun_addr)
var dispid=raw.malloc(12);
var str_tab={string str[]={string.fromto("accName",,1200);string.fromto("varChild",,1200);string.fromto("pszName",,1200)}};
var hret=GetIDsOfNames(ptr_interface,null,raw.malloc(str_tab),1,0x400,dispid);
io.print("hret,dispid",hret,topointer(hret),string.join(raw.convert(dispid,{INT arr[3]={}}).arr," "));
io.print(tostring(raw.convert(dispid,{INT arr[3]={}}).arr[1],16))  //0xffffec75
//========================================================调用GetTypeInfoCount方法
var fun_addr=raw.convert(topointer(raw.convert(ptr_interface,{addr val}).val+12),{addr val}).val;
var GetTypeInfoCount=obj_pro.remoteApi("int(ptr,ptr)",fun_addr)
var count=raw.malloc(4);
var hret=GetTypeInfoCount(ptr_interface,count);
io.print("hret,count",hret,count) 
//========================================================调用GetTypeInfo方法
var fun_addr=raw.convert(topointer(raw.convert(ptr_interface,{addr val}).val+16),{addr val}).val;
var GetTypeInfo=obj_pro.remoteApi("int(ptr,int,int,ptr&)",fun_addr)
var hret,ppTypeInfo=GetTypeInfo(ptr_interface,0,0x400,);
io.print("hret,ppTypeInfo",hret,ppTypeInfo) 
//======================================================调用GetTypeAttr方法
var TYPEATTR={
    struct guid=win.guid();
	int arr1[6];
	INT typekind;     //typekind=4=TKIND_INTERFACE
	word cFuncs;
	int arr2[10];
}
var fun_addr=raw.convert(topointer(raw.convert(ppTypeInfo,{addr val}).val+12),{addr val}).val;
var GetTypeAttr=obj_pro.remoteApi("int(ptr,ptr&)",fun_addr)
var hret,ppTypeAttr=GetTypeAttr(ppTypeInfo);
io.print("hret,ppTypeAttr",hret,ppTypeAttr);
//=====================================================获取方法个数和guid
raw.convert(ppTypeAttr,TYPEATTR);
io.print(TYPEATTR.guid,"方法计数:",TYPEATTR.cFuncs,TYPEATTR.typekind);
//======================================================
var FUNCDESC={
	INT memid;
	int arr1[3];
	int invkind;
	word arr2[21];
}
var fun_addr=raw.convert(topointer(raw.convert(ppTypeInfo,{addr val}).val+20),{addr val}).val;
var GetFuncDesc=obj_pro.remoteApi("int(ptr,int,ptr&)",fun_addr)
var fun_addr=raw.convert(topointer(raw.convert(ppTypeInfo,{addr val}).val+28),{addr val}).val;
var GetNames=obj_pro.remoteApi("int(ptr,INT,ptr&,INT,int&)",fun_addr)  //声明GetNames方法

for(i=1;TYPEATTR.cFuncs;1){
    //var nameArr=raw.malloc(96*16);
	var hret,ppFuncDesc=GetFuncDesc(ppTypeInfo,i-1,);	
	raw.convert(ppFuncDesc,FUNCDESC);
	io.print("hret,pFuncDesc",hret,ppFuncDesc,tostring(FUNCDESC.memid,16),FUNCDESC.invkind);
	var hret,nameArr,len=GetNames(ppTypeInfo,FUNCDESC.memid,,16,0);
	io.print("hret,GetNames",hret,nameArr,len);
	//io.print(string.join(raw.convert(nameArr,{BYTE arr[192]={}}).arr,","));
	io.print(raw.str(nameArr,true));
}


//======================================================		
console.pause(true);

王港 版本3 , 写记下来,后面试试

2017-12-08   #4

COM组件内库函数的获取:(代替DumpTypeInfo)

内置的DumpTypeInfo不能输出到编辑框edit或者其他listbox和listview.

但是下面这个可以实现了!

import console; 
//获取com对象成员列表 
 import win;
import com;
import console;
 
console.open();
var cchnwd = console.getWindow();
win.setTopmost(cchnwd);
//调用COM组件
obj = com.CreateObject("CDO.Message"); 
//获取COM组件类型库信息
var typeinfo = com.GetTypeInfo(obj)
//准备存储获取到的类型库信息
var funcTab = {};
//console.log("共有函数: "++typeinfo.GetTypeAttr().Funcs ++ " 个");
for(i=0;typeinfo.GetTypeAttr().Funcs-1;1){ 
    table.push(funcTab,table.clone(typeinfo.GetFuncDesc(i) )); 
}
 for(i=1;#funcTab;1){
     var funcPara = null;//参数合成
 	if(funcTab[i].Params != null){
 		//console.dump(funcTab[i]);
 		//总共几个变量参数
 		for(j=1;funcTab[i].Params;1){
 			var parametersTab = (funcTab[i].parameters)[j];
 			if( parametersTab != null ){
 				//console.dump(parametersTab);
 				if(j==1){
 					funcPara = string.concat(funcPara,parametersTab._com_type," ",parametersTab.name);
 				}else {
 					funcPara = string.concat(funcPara,',',parametersTab._com_type," ",parametersTab.name);
 				}
 				
 			}
 		
 		}
 		
 		console.log(string.concat("函数为: ",funcTab[i]._com_type ," ",funcTab[i].name ,"( ",funcPara , " );"));
 		
 	}
 
 }
 
console.pause(true);

blob.png

2017-12-08   #5

写了一个完整的com组件函数并输出到edit示例:

import win.ui;
/*DSG{{*/
var winform = win.form(text="COM组件函数查看演示";right=759;bottom=455;border="dialog frame")
winform.add(
button={cls="button";text="查看该组件内置函数";left=566;top=419;right=756;bottom=450;z=3};
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};
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}
)
/*}}*/

var loadFunc = function( comMsg ){
 	import com;
	//调用COM组件
	obj = com.CreateObject( comMsg ); 
	//获取COM组件类型库信息
	var typeinfo = com.GetTypeInfo(obj)
	//准备存储获取到的类型库信息
	var funcTab = {};
	//下面直接调用函数总数目不准确,因为有写com组件里有空函数
	//winform.funcEdit.log("共有函数: "++typeinfo.GetTypeAttr().Funcs ++ " 个!",'\r\n');
	for(i=0;typeinfo.GetTypeAttr().Funcs-1;1){ 
    	table.push(funcTab,table.clone(typeinfo.GetFuncDesc(i) )); 
	}
 	for(i=1;#funcTab;1){
     	var funcPara = null;//参数合成
 		if(funcTab[i].Params != null){
 			//console.dump(funcTab[i]);
 			//总共几个变量参数
 			for(j=1;funcTab[i].Params;1){
 				var parametersTab = (funcTab[i].parameters)[j];
 				if( parametersTab != null ){
 					//console.dump(parametersTab);
 					if(j==1){
 						funcPara = string.concat(funcPara,parametersTab._com_type," ",parametersTab.name);
 					}else {
 						funcPara = string.concat(funcPara,',',parametersTab._com_type," ",parametersTab.name);
 					}
 					
 				}
 			
 			}
 			//输出
 			winform.funcEdit.log(string.concat(funcTab[i]._com_type ," ",funcTab[i].name ,"( ",funcPara , " );"),'\r\n');
 			
 		}
 	
 	}
 }
    
        
winform.button.oncommand = function(id,event){
	
	winform.funcEdit.clear();
	loadFunc(winform.comEdit.text);
	
}






winform.show() 
win.loopMessage();

blob.png

再此, 感谢群里: 王港 kio1 codex 阿法牛 indertust ...等人对我的指导!

2018-04-04   #6
//HImageX图像库
import com;
import com.activeX;
import com.lite;
namespace Halcon;

class HImageX{
	ctor(  ){
		try{
			this =  _dll.createObject("{6ebd90e7-d219-11d2-ade5-0000c00f4ef9}");
		}
		catch(e){
			..com.activeX.regsvr32("\res\halconx.dll");
			this =  _dll.createObject("{6ebd90e7-d219-11d2-ade5-0000c00f4ef9}");
		}
	};
	
	@_metaProperty;
}

namespace HImageX{
	_dll = ..com.lite("\res\halconx.dll"); 
}


/**intellisense()
Halcon.HImageX = Halcon视觉库
Halcon.HImageX() = 初始化Halcon视觉库的HImageX对象
Halcon.HImageX() = !HalconHImageX.
!HalconHImageX.WienerFilterNi = @HImageX.WienerFilterNi( Psf , NoiseRegion , MaskWidth , MaskHeight );
!HalconHImageX.WienerFilter = @HImageX.WienerFilter( Psf , FilteredImage );
!HalconHImageX.GenPsfMotion = @HImageX.GenPsfMotion( PSFwidth , PSFheight , Blurring , Angle , Type );
!HalconHImageX.SimulateMotion = @HImageX.SimulateMotion( Blurring , Angle , Type );
!HalconHImageX.GenPsfDefocus = @HImageX.GenPsfDefocus( PSFwidth , PSFheight , Blurring );
!HalconHImageX.SimulateDefocus = @HImageX.SimulateDefocus( Blurring );
end intellisense**/


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
Htmlayout皮肤Htmlayout皮肤引擎介绍
黑猫Aar教程网:简码编程
C大Aardio论坛:Aar爱好者论坛
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...