如何以编程方式发现Win32::OLE对象';Perl中的属性和方法?

如何以编程方式发现Win32::OLE对象';Perl中的属性和方法?,perl,com,win32ole,Perl,Com,Win32ole,有了Perl,使用该库加载COM/OLE对象并控制它们非常容易。我遇到的问题是确切地知道我正在访问的对象中有哪些方法和属性可用。其他语言中的某些OLE工具包可以通过读取对象上可用的所有属性和方法来为您生成静态接口。Perl的Win32::OLE库中是否存在这样的功能?否。但看起来必要的类型发现代码是。您可以使用它作为参考,编写自己的perl扩展,公开函数和方法类型及名称。如果您这样做,有一件事是肯定的: print Data::Dumper->Dump( [ $my_ole_object

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

否。但看起来必要的类型发现代码是。您可以使用它作为参考,编写自己的perl扩展,公开函数和方法类型及名称。

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

print Data::Dumper->Dump( [ $my_ole_object ] )
你可能只会得到一个无止境的循环。但您可以这样修改它:

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

然后,您至少可以看到属性名称。要查看它们的下一级值,您需要
Maxdepth=3
。除了文档之外,我不确定如何看待所有的方法

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


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

您应该直接从
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;
}
所有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;
}
my$typeinfo=$OleObject->GetTypeInfo();
my$attr=$typeinfo->_GetTypeAttr();
对于(my$i=0;$i<$attr->{cFuncs};$i++){
my$desc=$typeinfo->\u GetFuncDesc($i);
#方法的调用转换在%$desc中有详细说明
我的$funcname=@{$typeinfo->GetNames($desc->{memid},1)}[0];
说出$funcname;
}
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;
}