2011-03-23 12 views
12

Con Perl, es bastante fácil usar la biblioteca Win32::OLE para cargar objetos COM/OLE y controlarlos. El problema al que me estoy enfrentando es saber exactamente qué métodos y propiedades están disponibles en el objeto al que estoy accediendo. Algunos kits de herramientas OLE en otros idiomas pueden generar una interfaz estática para usted al leer todas las propiedades y métodos que están disponibles en el objeto. ¿Existe una instalación de este tipo con la biblioteca Win32::OLE de Perl?¿Cómo puedo descubrir programáticamente las propiedades y métodos de un objeto Win32 :: OLE en Perl?

Respuesta

13

Debe acceder directamente a las propiedades desde las claves del objeto Win32::OLE. Usemos Excel como ejemplo. El código es de Win32 :: OLE examples - properties.pl Mostrará todas las propiedades de un objeto 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 [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; 
} 

en una línea, para obtener todas las propiedades de un Win32 :: objeto OLE:

keys %$OleObject; 

Todos los métodos OLE pueden ser recuperados a través de Win32::OLE::TypeInfo. este bloque de código imprimirá todos los nombres de método de $ 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; 
} 
+0

Impresionante, me tienes en el camino correcto. ¡Gracias! –

1

No. pero parece que el código de descubrimiento de tipo necesario es already in Win32::OLE's implementation. Puede usarlo como referencia para escribir su propia extensión Perl que expone la función y los tipos de métodos y nombres.

3

Una cosa es segura, si usted hace esto:

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

que es probable que sólo obtendrá un bucle sin fin. Pero puede modificarlo así:

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

Y entonces al menos puede ver los nombres de las propiedades. Para ver su próximo nivel de valores, necesitará Maxdepth=3. No estoy seguro de cómo mirar todos los métodos que no sean la documentación.

1

Si está utilizando ActiveState, hay un navegador OLE incluido (disponible en el menú Inicio). Requiere que habilite "Inicializar y guiar controles ActiveX no marcados como seguros" configuración de seguridad de la "Intranet local" zona, pero generalmente funciona bien y le proporciona una lista de todas las propiedades y métodos junto con sus tipos.

Otra buena fuente es la documentación en aplicaciones individuales: las aplicaciones de MS generalmente vienen con documentos de VBA. Tenga en cuenta que el modelo de objeto descrito en esas aplicaciones es el mismo enlace OLE a.

Cuestiones relacionadas