/*! Unregisters the component with id \a cid from the system component registry and returns TRUE if the component was unregistered successfully, otherwise returns FALSE. Call this function for each component in an implementation of \link QComponentRegistrationInterface::unregisterComponents() unregisterComponents() \endlink. \sa registerComponent(), unregisterServer() */ bool QComponentFactory::unregisterComponent( const QUuid &cid ) { QSettings settings; bool ok = FALSE; settings.insertSearchPath( QSettings::Windows, "/Classes" ); QString cidStr = cid.toString().upper(); if ( cidStr.isEmpty() ) return FALSE; // unregister the human readable part QString vName = settings.readEntry( "/CLSID/" + cidStr + "/ProgID/Default", QString::null, &ok ); if ( ok ) { QString name = settings.readEntry( "/CLSID/" + cidStr + "/VersionIndependentProgID/Default", QString::null ); if ( !!name && settings.readEntry( "/" + name + "/CurVer/Default" ) == vName ) { // unregistering the current version -> change CurVer to previous version QString version = vName.right( vName.length() - name.length() - 1 ); QString newVerName; QString newCidStr; if ( version.find( '.' ) == -1 ) { int ver = version.toInt(); // see if a lesser version is installed, and make that the CurVer while ( ver-- ) { newVerName = name + "." + QString::number( ver ); newCidStr = settings.readEntry( "/" + newVerName + "/CLSID/Default" ); if ( !!newCidStr ) break; } } else { // oh well... } if ( !!newCidStr ) { settings.writeEntry( "/" + name + "/CurVer/Default", newVerName ); settings.writeEntry( "/" + name + "/CLSID/Default", newCidStr ); } else { settings.removeEntry( "/" + name + "/CurVer/Default" ); settings.removeEntry( "/" + name + "/CLSID/Default" ); settings.removeEntry( "/" + name + "/Default" ); } } settings.removeEntry( "/" + vName + "/CLSID/Default" ); settings.removeEntry( "/" + vName + "/Default" ); } settings.removeEntry( "/CLSID/" + cidStr + "/VersionIndependentProgID/Default" ); settings.removeEntry( "/CLSID/" + cidStr + "/ProgID/Default" ); settings.removeEntry( "/CLSID/" + cidStr + "/InprocServer32/Default" ); ok = settings.removeEntry( "/CLSID/" + cidStr + "/Default" ); return ok; }