使用Perl,使用Win32::OLE
库加载COM / OLE对象并控制它们非常容易。我遇到的问题是确切地知道我正在访问的对象中有哪些方法和属性可用。其他语言中的某些OLE工具包可以通过读取对象上可用的所有属性和方法为您生成静态接口。 Perl的Win32::OLE
库中是否存在这样的工具?
答案 0 :(得分:13)
您应该直接从Win32::OLE
对象的键访问属性。我们以Excel为例。代码来自Win32 :: OLE示例 - properties.pl
它将显示Win32::OLE
对象的所有属性。
my $Excel = Win32::OLE->new('Excel.Application', 'Quit');
# Add a workbook to get some more property values defined
$Excel->Workbooks->Add;
print "OLE object's properties:\n";
foreach my $Key (sort keys %$Excel) {
my $Value;
eval {$Value = $Excel->{$Key} };
$Value = "***Exception***" if $@;
$Value = "<undef>" unless defined $Value;
$Value = '['.Win32::OLE->QueryObjectType($Value).']'
if UNIVERSAL::isa($Value,'Win32::OLE');
$Value = '('.join(',',@$Value).')' if ref $Value eq 'ARRAY';
printf "%s %s %s\n", $Key, '.' x (40-length($Key)), $Value;
}
在一行中,获取Win32 :: OLE对象的所有属性:
keys %$OleObject;
可以通过Win32::OLE::TypeInfo
检索所有OLE方法。这段代码将打印$ OleObject的所有方法名称:
my $typeinfo = $OleObject->GetTypeInfo();
my $attr = $typeinfo->_GetTypeAttr();
for (my $i = 0; $i< $attr->{cFuncs}; $i++) {
my $desc = $typeinfo->_GetFuncDesc($i);
# the call conversion of method was detailed in %$desc
my $funcname = @{$typeinfo->_GetNames($desc->{memid}, 1)}[0];
say $funcname;
}
答案 1 :(得分:3)
有一件事是肯定的,如果你这样做:
print Data::Dumper->Dump( [ $my_ole_object ] )
你可能只会得到一个无限循环。但你可以像这样修改它:
local $Data::Dumper::Maxdepth = 2;
print Data::Dumper->Dump( [ $my_ole_object ] )
然后你至少可以看到属性名称。要查看下一级别的值,您需要Maxdepth=3
。我不确定如何查看除文档之外的所有方法。
答案 2 :(得分:1)
没有。但看起来必要的类型发现代码是already in Win32::OLE's implementation。您可以将它用作编写自己的perl扩展的引用,该扩展公开函数和方法类型和名称。
答案 3 :(得分:1)
如果您使用的是ActiveState,则包含OLE浏览器(在“开始”菜单中可用)。它要求您启用“初始化并编写未标记为安全的ActiveX控件”“本地Intranet”区域的安全设置,但通常它运行良好并为您提供所有属性和方法及其类型。
另一个好的来源是个人应用程序中的文档 - MS应用程序通常附带VBA文档。请注意,这些应用程序中描述的对象模型与OLE链接相同。