Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вы должны получить доступ к свойствам непосредственно из ключей объекта 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 properties:\n";
foreach my $Key (sort keys %$Excel) {
    my $Value;

    eval {$Value = $Excel->{$Key} };
    $Value = "***Exception***" if [email protected];

    $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;
}

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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