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