Sexy! Thanks Mark and Jan. mark pryor wrote: > --- Jan Dubois <[EMAIL PROTECTED]> wrote: > > >> On Wed, 10 Jan 2007 09:36:23 +0800, Foo JH >> <[EMAIL PROTECTED]> >> wrote: >> >> >>> I was wondering if there is any API that lets me >>> >> inspect a COM object in >> >>> Perl. By this I mean list out the functions, >>> >> classes, stuff like that. >> >>> I see this happening with the OLE browser that >>> >> comes with the ActivePerl >> >>> HTML manual. Is that written in Perl? >>> >> Yes, it is written in Perl, but the >> Win32::OLE::TypeLib and >> Win32::OLE::TypeInfo classes it uses are not >> documented. I wrote the >> OLE browser to explore both using PerlScript for >> DHTML and support for >> OLE typelibs in Win32::OLE. Therefore the APIs were >> only experimental. >> Since there was not a lot of interest in this >> functionality from other >> people, I never spend the time to finalize the API >> and document it. But >> you can probably figure a lot of this out by looking >> at the OLE browser >> source. >> >> Cheers, >> -Jan >> _______________________________________________ >> Perl-Win32-Users mailing list >> Perl-Win32-Users@listserv.ActiveState.com >> To unsubscribe: >> http://listserv.ActiveState.com/mailman/mysubs >> >> > Hello, > > Starting in Perl 5.8.8 build 819 (Aug 29 2006), > ActiveState has added a patch which gets working the > TLBInf32.dll object. > > This is an activex wrapper around interfaces in > OLEAUT32.dll, like ITypeLib. > > Here is a sample script that uses a combination of > registry scraping and TLBinf32 methods to analyze a > COM object like Scripting.FileSystemObject > > ------------- tlbtest.pl ------------ > #!/usr/bin/perl; > use strict; > use warnings; > > use Win32::OLE qw(in with); > use Win32::TieRegistry( Delimiter=>"/", ArrayValues=>0 > ); > > # TLI main progid > my $Obj = Win32::OLE->new('TLI.TLIApplication', > \&OleQuit) || die("could not create Obj\n"); > > print "ref=", ref($Obj), "\n"; > > my $oRef = > $Obj->TypeLibInfoFromFile("C:\\WINDOWS\\system32\\scrrun.dll"); > > print "ref=", ref($oRef), "\n"; > > # all tlbinf32 collections are 1 based > my $cc = $oRef->{Coclasses}; > > my $iCount = $cc->{Count}; > > my $libname = $oRef->{Name}; > print "LibName=", $libname, " cnt=", $iCount, "\n"; > my $i = 1; > > my $pkey = $Registry->Open("HKEY_CLASSES_ROOT/"); > while ($i <= $iCount) { > my $oItem = $cc->Item($i); > my $sName = $oItem->{Name}; > my $progidkey = $pkey->Open("$libname\.$sName"); > if ($progidkey) { > > # if the TypeFlag masks with 2 then its createable > (11 works too) > my $tkind = $oItem->{AttributeMask}; > if ( $tkind and 2 ) { > print $progidkey->GetValue(''), "\n"; > print "$sName \n"; > } > } > > $i ++; > } > > print "type=", ref($Registry), "\n"; > > my $libs = > $Registry->Open("HKEY_CLASSES_ROOT/TypeLib"); > #keys(%$diskKey) > foreach my $guid ( $libs->SubKeyNames ) { > > # step down and open the next subkey > my $verkeys = $libs->Open("$guid"); > > # > foreach my $sver ( $verkeys->SubKeyNames ) { > my $mkey = $libs->Open("$guid/$sver/"); > my $helpstr = $mkey->GetValue(''); > ; > > my @sk = $mkey->SubKeyNames; > # the langcode is not known apriori (usually 0), so > take it as the 0'th subkeyname > my $lc = $sk[0]; > > # version must be a decimal with a decimal point > (lame messenger tlb has a bug $MS!) > next, unless (index($sver, '.') > 0); > > #get the inproc server path > my $pathkey = $libs->Open("$guid/$sver/$lc/win32/") > ; > > my $pathval = "null"; > if ($pathkey) { > $pathval = $pathkey->GetValue(''); > } > # $pathkey->GetValue('') > > print $pathval, " ",$helpstr," $sver $guid\n"; > } > # pass > } > > # subroutines below > > sub OleQuit { > my $obj = shift; > undefine $obj; > } > ----------- end script ---------- > > > > ____________________________________________________________________________________ > We won't tell. Get more on shows you hate to love > (and love to hate): Yahoo! TV's Guilty Pleasures list. > http://tv.yahoo.com/collections/265 >
_______________________________________________ Perl-Win32-Users mailing list Perl-Win32-Users@listserv.ActiveState.com To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs