Как программно обнаружить свойства и методы объекта Win32::OLE в Perl?

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


person Robert P    schedule 23.03.2011    source источник


Ответы (4)


Вы должны получить доступ к свойствам из ключей объекта 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;
}
person Yi Zhao    schedule 23.03.2011

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

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

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

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

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

person Axeman    schedule 23.03.2011

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

person Community    schedule 23.03.2011

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

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

person bvr    schedule 23.03.2011