#!/usr/bin/perl -w use strict; use Win32::OLE; use Win32::OLE::Const; use Win32::OLE::TypeInfo qw( TKIND_ENUM ); use Data::Dumper; my $typelib = Win32::OLE::Const->LoadRegTypeLib('IP NAT Helper'); my $enumTree = TypeLibToEnums($typelib); print Dumper($enumTree); sub VAR_CONST () { 2 } sub TypeLibToEnums { my %rethash; my $typelib = $_[0]; die "TypeLibToEnums: not a Win32::OLE::TypeLib obj" if ! ref($typelib) || ! $typelib->isa('Win32::OLE::TypeLib'); my $typeinfocount = $typelib->_GetTypeInfoCount(); for(0..$typeinfocount-1){ my $typeinfo = $typelib->GetTypeInfo($_); if($typeinfo->_GetTypeAttr()->{'typekind'} == TKIND_ENUM){ $rethash{$typeinfo->_GetDocumentation(-1)->{'Name'}} = TypeInfoToEnumHash($typeinfo); } } return \%rethash; } sub TypeInfoToEnumHash { my %rethash; my $typeinfo = $_[0]; die "TypeInfoToEnumHash: not a Win32::OLE::TypeInfo obj" if ! ref($typeinfo) || ! $typeinfo->isa('Win32::OLE::TypeInfo'); my $attrs = $typeinfo->_GetTypeAttr(); die "the TypeInfo is not an ENUM" if !$attrs->{'cVars'} || $attrs->{'typekind'} != TKIND_ENUM ; for(0..$attrs->{'cVars'}-1){ my $vardesc = $typeinfo->_GetVarDesc($_); #check done in OLE.xs below not needed #die "the TypeInfo is not an ENUM" # if $vardesc->{'varkind'} != VAR_CONST; $rethash{$typeinfo->_GetDocumentation($vardesc->{'memid'})->{'Name'}} = $vardesc->{'varValue'}; } return \%rethash; } #### $VAR1 = { "ICOMMONCONFIG_DISPIDS" => { "ICOMMONCONFIG_DISPID_ENABLEDFORINTERNET" => 5, "ICOMMONCONFIG_DISPID_GETCOMMONLINKPROPERTIES" => 14, "ICOMMONCONFIG_DISPID_GETTOTALBYTESRECEIVED" => 17, "ICOMMONCONFIG_DISPID_GETTOTALBYTESSENT" => 16, "ICOMMONCONFIG_DISPID_GETTOTALPACKETSRECEIVED" => 19, "ICOMMONCONFIG_DISPID_GETTOTALPACKETSSENT" => 18, "ICOMMONCONFIG_DISPID_LAYER1DOWNSTREAMMAXBITRATE" => 2, "ICOMMONCONFIG_DISPID_LAYER1UPSTREAMMAXBITRATE" => 1, "ICOMMONCONFIG_DISPID_MAXIMUMACTIVECONNECTIONS" => 11, "ICOMMONCONFIG_DISPID_PHYSICALLINKSTATUS" => 3, "ICOMMONCONFIG_DISPID_SETENABLEDFORINTERNET" => 4, "ICOMMONCONFIG_DISPID_TOTALBYTESRECEIVED" => 7, "ICOMMONCONFIG_DISPID_TOTALBYTESSENT" => 6, "ICOMMONCONFIG_DISPID_TOTALPACKETSRECEIVED" => 9, "ICOMMONCONFIG_DISPID_TOTALPACKETSSSENT" => 8, "ICOMMONCONFIG_DISPID_WANACCESSPROVIDER" => 10, "ICOMMONCONFIG_DISPID_WANACCESSTYPE" => 0, "ICOMMONCONFIG_DISPID_XGETICSSTATISTICS" => 15, "ICOMMONCONFIG_DISPID_XPERSONALFIREWALLENABLED" => 12, "ICOMMONCONFIG_DISPID_XUPTIME" => 13 }, "IOSINFO_DISPIDS" => { "IOSINFO_DISPID_MAGICON" => 1, "IOSINFO_DISPID_OSBUILDNUMBER" => 4, "IOSINFO_DISPID_OSMACHINENAME" => 5, "IOSINFO_DISPID_OSMAJORVERSION" => 2, "IOSINFO_DISPID_OSMINORVERSION" => 3 }, "IWANIPCONNECTION_DISPIDS" => { "IWANIPCONNECTION_DISPIDS_MAGICON" => 1, "IWANIPCONNECTION_DISPID_ADDPORTMAPPING" => 32, "IWANIPCONNECTION_DISPID_CONNECTIONSTATUS" => 4, "IWANIPCONNECTION_DISPID_CONNECTIONTYPE" => 2, "IWANIPCONNECTION_DISPID_DELETEPORTMAPPING" => 33, "IWANIPCONNECTION_DISPID_DOWNSTREAMMAXBITRATE" => 7, "IWANIPCONNECTION_DISPID_EXTERNALIPADDRESS" => 12, "IWANIPCONNECTION_DISPID_EXTERNALPORT" => 14, "IWANIPCONNECTION_DISPID_FORCETERMINATION" => 26, "IWANIPCONNECTION_DISPID_GETCONNECTIONTYPE" => 24, "IWANIPCONNECTION_DISPID_GETEXTERNALIPADDRESS" => 34, "IWANIPCONNECTION_DISPID_GETGENERICPORTMAPPINGENTRY" => 31, "IWANIPCONNECTION_DISPID_GETLINKLAYERMAXBITRATES" => 29, "IWANIPCONNECTION_DISPID_GETNATRSIPSTATUS" => 28, "IWANIPCONNECTION_DISPID_GETSPECIFICPORTMAPPINGENTRY" => 30, "IWANIPCONNECTION_DISPID_GETSTATUSINFO" => 27, "IWANIPCONNECTION_DISPID_INTERNALCLIENT" => 17, "IWANIPCONNECTION_DISPID_INTERNALPORT" => 15, "IWANIPCONNECTION_DISPID_LASTCONNECTIONERROR" => 8, "IWANIPCONNECTION_DISPID_NAME" => 11, "IWANIPCONNECTION_DISPID_NATENABLED" => 10, "IWANIPCONNECTION_DISPID_PORTMAPPINGDESCRIPTION" => 18, "IWANIPCONNECTION_DISPID_PORTMAPPINGENABLED" => 19, "IWANIPCONNECTION_DISPID_PORTMAPPINGLEASEDURATION" => 20, "IWANIPCONNECTION_DISPID_PORTMAPPINGNUMBEROFENTRIES" => 22, "IWANIPCONNECTION_DISPID_PORTMAPPINGPROTOCOL" => 16, "IWANIPCONNECTION_DISPID_POSSIBLECONNECTIONTYPES" => 3, "IWANIPCONNECTION_DISPID_REMOTEHOST" => 13, "IWANIPCONNECTION_DISPID_REQUESTCONNECTION" => 25, "IWANIPCONNECTION_DISPID_RSIPAVAILABLE" => 9, "IWANIPCONNECTION_DISPID_SETCONNECTIONTYPE" => 23, "IWANIPCONNECTION_DISPID_UPSTREAMMAXBITRATE" => 6, "IWANIPCONNECTION_DISPID_UPTIME" => 5, "IWANIPCONNECTION_DISPID_XPORTMAPPINGINDEX" => 21 }, "IWANPOTSLINKCONFIG_DISPIDS" => { "IWANPOTSLINKCONFIG_DISPIDS_MAGICON" => 1, "IWANPOTSLINKCONFIG_DISPID_DELAYBETWEENRETRIES" => 6, "IWANPOTSLINKCONFIG_DISPID_GETCALLRETRYINFO" => 8, "IWANPOTSLINKCONFIG_DISPID_GETISPINFO" => 7, "IWANPOTSLINKCONFIG_DISPID_ISPINFO" => 3, "IWANPOTSLINKCONFIG_DISPID_ISPPHONENUMBER" => 2, "IWANPOTSLINKCONFIG_DISPID_LINKTYPE" => 4, "IWANPOTSLINKCONFIG_DISPID_NUMBEROFRETRIES" => 5 } };