// Used to get the basic info that is used by this type
        // of node
        protected override Object ProcessChild(RegistryKey key,
                                               String subKeyName)
        {
            // Eliminate the known keys and the file extensions
            if (subKeyName.StartsWith(".") ||
                subKeyName.Equals("CLSID") ||
                subKeyName.Equals("CID") ||
                subKeyName.Equals("AppId") ||
                subKeyName.Equals("Interface") ||
                subKeyName.Equals("TypeLib"))
            {
                return(null);
            }

            ComClassInfo classInfo = null;

            _sortKey = subKeyName;

            ProgIdNode node = new ProgIdNode();

            node._progId = _sortKey;

            // See if there is a CLSID for this program id
            RegistryKey clsIdKey =
                key.OpenSubKey("CLSID");

            if (clsIdKey != null)
            {
                String clsId = (String)clsIdKey.GetValue(null);
                if (clsId != null)
                {
                    RegistryKey classKey =
                        Windows.KeyCLSID.OpenSubKey(clsId);

                    if (classKey != null)
                    {
                        classInfo =
                            ComClassInfo.GetClassInfo(classKey, clsId);
                        node._info = classInfo;
                        classInfo.AddProgId(subKeyName);
                    }
                }
            }

            // Don't bother with it unless it refers to a class
            if (classInfo == null)
            {
                return(null);
            }
            return(node);
        }
        // Allocates the correct type of node
        protected override BrowserTreeNode AllocateChildNode(Object obj)
        {
            if (_progress != null)
            {
                _progress.UpdateProgress(1);
            }

            ProgIdNode      progIdNode = (ProgIdNode)obj;
            ComTypeTreeNode node       = new ComTypeTreeNode(progIdNode._info,
                                                             progIdNode._progId);

            node.IntermediateNodeTypes = null;
            return(node);
        }
        // Used to get the basic info that is used by this type
        // of node
        protected override Object ProcessChild(RegistryKey key,
                                                  String subKeyName)
        {

            // Eliminate the known keys and the file extensions
            if (subKeyName.StartsWith(".") ||
                subKeyName.Equals("CLSID") ||
                subKeyName.Equals("CID") ||
                subKeyName.Equals("AppId") ||
                subKeyName.Equals("Interface") ||
                subKeyName.Equals("TypeLib"))
                return null;

            ComClassInfo classInfo = null;
            _sortKey = subKeyName;

            ProgIdNode node = new ProgIdNode();
            node._progId = _sortKey;
            
            // See if there is a CLSID for this program id
            RegistryKey clsIdKey = 
                key.OpenSubKey("CLSID");
            if (clsIdKey != null)
            {
                String clsId = (String)clsIdKey.GetValue(null);
                if (clsId != null)
                {
                    RegistryKey classKey = 
                        Windows.KeyCLSID.OpenSubKey(clsId);
                                
                    if (classKey != null)
                    {
                        classInfo = 
                            ComClassInfo.GetClassInfo(classKey, clsId);
                        node._info = classInfo;
                        classInfo.AddProgId(subKeyName);
                    }
                }
            }

            // Don't bother with it unless it refers to a class
            if (classInfo == null)
                return null;
            return node;
        }