This will generate a hash tree of all enums in a OLE library. Much cleaner and more organized than the flat hash that Win32::OLE::Const makes. This also shows some use of the undocumented Win32::OLE side.
#!/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; }
output
$VAR1 = { "ICOMMONCONFIG_DISPIDS" => { "ICOMMONCONFIG_DISPID_ENABLEDFO +RINTERNET" => 5, "ICOMMONCONFIG_DISPID_GETCOMMON +LINKPROPERTIES" => 14, "ICOMMONCONFIG_DISPID_GETTOTALB +YTESRECEIVED" => 17, "ICOMMONCONFIG_DISPID_GETTOTALB +YTESSENT" => 16, "ICOMMONCONFIG_DISPID_GETTOTALP +ACKETSRECEIVED" => 19, "ICOMMONCONFIG_DISPID_GETTOTALP +ACKETSSENT" => 18, "ICOMMONCONFIG_DISPID_LAYER1DOW +NSTREAMMAXBITRATE" => 2, "ICOMMONCONFIG_DISPID_LAYER1UPS +TREAMMAXBITRATE" => 1, "ICOMMONCONFIG_DISPID_MAXIMUMAC +TIVECONNECTIONS" => 11, "ICOMMONCONFIG_DISPID_PHYSICALL +INKSTATUS" => 3, "ICOMMONCONFIG_DISPID_SETENABLE +DFORINTERNET" => 4, "ICOMMONCONFIG_DISPID_TOTALBYTE +SRECEIVED" => 7, "ICOMMONCONFIG_DISPID_TOTALBYTE +SSENT" => 6, "ICOMMONCONFIG_DISPID_TOTALPACK +ETSRECEIVED" => 9, "ICOMMONCONFIG_DISPID_TOTALPACK +ETSSSENT" => 8, "ICOMMONCONFIG_DISPID_WANACCESS +PROVIDER" => 10, "ICOMMONCONFIG_DISPID_WANACCESS +TYPE" => 0, "ICOMMONCONFIG_DISPID_XGETICSST +ATISTICS" => 15, "ICOMMONCONFIG_DISPID_XPERSONAL +FIREWALLENABLED" => 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_MA +GICON" => 1, "IWANIPCONNECTION_DISPID_ADD +PORTMAPPING" => 32, "IWANIPCONNECTION_DISPID_CON +NECTIONSTATUS" => 4, "IWANIPCONNECTION_DISPID_CON +NECTIONTYPE" => 2, "IWANIPCONNECTION_DISPID_DEL +ETEPORTMAPPING" => 33, "IWANIPCONNECTION_DISPID_DOW +NSTREAMMAXBITRATE" => 7, "IWANIPCONNECTION_DISPID_EXT +ERNALIPADDRESS" => 12, "IWANIPCONNECTION_DISPID_EXT +ERNALPORT" => 14, "IWANIPCONNECTION_DISPID_FOR +CETERMINATION" => 26, "IWANIPCONNECTION_DISPID_GET +CONNECTIONTYPE" => 24, "IWANIPCONNECTION_DISPID_GET +EXTERNALIPADDRESS" => 34, "IWANIPCONNECTION_DISPID_GET +GENERICPORTMAPPINGENTRY" => 31, "IWANIPCONNECTION_DISPID_GET +LINKLAYERMAXBITRATES" => 29, "IWANIPCONNECTION_DISPID_GET +NATRSIPSTATUS" => 28, "IWANIPCONNECTION_DISPID_GET +SPECIFICPORTMAPPINGENTRY" => 30, "IWANIPCONNECTION_DISPID_GET +STATUSINFO" => 27, "IWANIPCONNECTION_DISPID_INT +ERNALCLIENT" => 17, "IWANIPCONNECTION_DISPID_INT +ERNALPORT" => 15, "IWANIPCONNECTION_DISPID_LAS +TCONNECTIONERROR" => 8, "IWANIPCONNECTION_DISPID_NAM +E" => 11, "IWANIPCONNECTION_DISPID_NAT +ENABLED" => 10, "IWANIPCONNECTION_DISPID_POR +TMAPPINGDESCRIPTION" => 18, "IWANIPCONNECTION_DISPID_POR +TMAPPINGENABLED" => 19, "IWANIPCONNECTION_DISPID_POR +TMAPPINGLEASEDURATION" => 20, "IWANIPCONNECTION_DISPID_POR +TMAPPINGNUMBEROFENTRIES" => 22, "IWANIPCONNECTION_DISPID_POR +TMAPPINGPROTOCOL" => 16, "IWANIPCONNECTION_DISPID_POS +SIBLECONNECTIONTYPES" => 3, "IWANIPCONNECTION_DISPID_REM +OTEHOST" => 13, "IWANIPCONNECTION_DISPID_REQ +UESTCONNECTION" => 25, "IWANIPCONNECTION_DISPID_RSI +PAVAILABLE" => 9, "IWANIPCONNECTION_DISPID_SET +CONNECTIONTYPE" => 23, "IWANIPCONNECTION_DISPID_UPS +TREAMMAXBITRATE" => 6, "IWANIPCONNECTION_DISPID_UPT +IME" => 5, "IWANIPCONNECTION_DISPID_XPO +RTMAPPINGINDEX" => 21 }, "IWANPOTSLINKCONFIG_DISPIDS" => { "IWANPOTSLINKCONFIG_DISPID +S_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 } };