Win32::OLE
Perlを使用すると、ライブラリを使用してCOM/OLEオブジェクトをロードして制御するのは非常に簡単です。私が直面している問題は、アクセスしているオブジェクトで使用できるメソッドとプロパティを正確に把握していることです。他の言語の一部のOLEツールキットは、オブジェクトで使用可能なすべてのプロパティとメソッドを読み取ることにより、静的インターフェイスを生成できます。そのような機能はPerlのWin32::OLE
ライブラリに存在しますか?
4 に答える
Win32::OLE
オブジェクトのキーからプロパティに直接アクセスする必要があります。例としてエクセルを使用してみましょう。コードは Win32::OLE の例からのものです - properties.plWin32::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;
}
1 行で、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;
}
これを行うと、確かなことは次のとおりです。
print Data::Dumper->Dump( [ $my_ole_object ] )
おそらく無限ループしか得られません。ただし、次のように変更できます。
local $Data::Dumper::Maxdepth = 2;
print Data::Dumper->Dump( [ $my_ole_object ] )
そして、少なくともプロパティ名を見ることができます。次のレベルの値を確認するには、 が必要Maxdepth=3
です。ドキュメント以外のすべてのメソッドを見る方法が正確にはわかりません。
ActiveState を使用している場合は、OLE Browser が含まれています ([スタート] メニューで使用できます)。「ローカル イントラネット」ゾーンの「安全とマークされていない ActiveX コントロールを初期化してスクリプト化する」セキュリティ設定を有効にする必要がありますが、通常はうまく機能し、すべてのプロパティとメソッドのリストとそのタイプが表示されます。
もう 1 つの良い情報源は、個々のアプリケーションのドキュメントです。MS アプリケーションには通常、VBA ドキュメントが付属しています。これらのアプリで記述されているオブジェクト モデルは、OLE リンク先と同じであることに注意してください。
いいえ。ただし、必要な型検出コードは既に Win32::OLE の実装に含まれているようです。関数とメソッドの型と名前を公開する独自の perl 拡張機能を作成するためのリファレンスとして使用できます。