Как программно обнаружить свойства и методы объекта Win32 :: OLE в Perl? - PullRequest
13 голосов
/ 23 марта 2011

С Perl очень просто использовать библиотеку Win32::OLE для загрузки объектов COM / OLE и управления ими.Проблема, с которой я сталкиваюсь, заключается в том, чтобы точно знать, какие методы и свойства доступны в объекте, к которому я обращаюсь.Некоторые наборы инструментов OLE на других языках могут генерировать для вас статический интерфейс, читая все свойства и методы, доступные в объекте.Существует ли такая возможность с Win32::OLE библиотекой Perl?

Ответы [ 4 ]

13 голосов
/ 23 марта 2011

Вы должны получить доступ к свойствам непосредственно из ключей объекта 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;
}
3 голосов
/ 23 марта 2011

Одно можно сказать наверняка, если вы сделаете это:

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

вы, скорее всего, получите только бесконечный цикл.Но вы можете изменить его так:

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

И тогда вы сможете хотя бы увидеть имена свойств.Чтобы увидеть их следующий уровень значений, вам понадобится Maxdepth=3.Я не совсем уверен, как смотреть на все методы, кроме документации.

1 голос
/ 23 марта 2011

Если вы используете ActiveState, включен OLE Browser (доступно в меню «Пуск»). Требуется включить «Инициализация и сценарии элементов управления ActiveX, не помеченных как безопасные» Параметр безопасности зоны «Локальная интрасеть» , но, как правило, он работает хорошо и предоставляет список всех свойств. и методы вместе с его типами.

Другим хорошим источником является документация по отдельным приложениям - приложения MS обычно поставляются с документами VBA. Обратите внимание, что объектная модель, описанная в этих приложениях, представляет собой те же ссылки OLE.

1 голос
/ 23 марта 2011

Нет.но похоже, что необходимый код обнаружения типа уже находится в реализации Win32 :: OLE .Вы можете использовать его в качестве ссылки для написания собственного расширения perl, которое раскрывает типы и имена функций и методов.

...