13

Win32::OLE使用 Perl,使用库加载 COM/OLE 对象并控制它们非常容易。我遇到的问题是确切地知道我正在访问的对象中有哪些方法和属性可用。其他语言的一些 OLE 工具包可以通过读取对象上可用的所有属性和方法来为您生成静态接口。Perl 的Win32::OLE库中是否存在这样的工具?

4

4 回答 4

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;

所有 OLE 方法都可以通过Win32::OLE::TypeInfo. 此代码块将打印 $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;
}
于 2011-03-23T11:06:15.213 回答
3

有一件事是肯定的,如果你这样做:

print Data::Dumper->Dump( [ $my_ole_object ] )

你可能只会得到一个无限循环。但是你可以像这样修改它:

local $Data::Dumper::Maxdepth = 2;
print Data::Dumper->Dump( [ $my_ole_object ] )

然后你至少可以看到属性名称。要查看他们的下一级价值观,您将需要Maxdepth=3. 我不确定如何查看文档以外的所有方法。

于 2011-03-23T05:13:36.367 回答
1

不,但看起来必要的类型发现代码已经在 Win32::OLE 的实现中。您可以将其用作参考来编写您自己的 perl 扩展,以公开函数和方法的类型和名称。

于 2011-03-23T03:22:13.963 回答
1

如果您使用 ActiveState,则包含 OLE 浏览器(在“开始”菜单中可用)。它要求您启用“本地 Intranet”区域的“初始化并编写未标记为安全的 ActiveX 控件的脚本”安全设置,但通常它运行良好,并为您提供所有属性和方法及其类型的列表。

另一个很好的来源是单个应用程序中的文档——MS 应用程序通常带有 VBA 文档。请注意,这些应用程序中描述的对象模型是相同的 OLE 链接。

于 2011-03-23T06:57:55.363 回答