diff --git a/Source/Common/Preferences.cpp b/Source/Common/Preferences.cpp index 48ab5402a..01527ca68 100644 --- a/Source/Common/Preferences.cpp +++ b/Source/Common/Preferences.cpp @@ -802,6 +802,43 @@ int Preferences::ExplorerShell() } } + //Controls for legacy shell extension + int32s LegacyShellExtension=Config.Read(__T("ShellExtension")).To_int32s(); + int32s LegacyShellExtension_Folder=Config.Read(__T("ShellExtension_Folder")).To_int32s(); + + //Control writing registry for modern IExplorerCommand-based shell extension + bool ModernShellUsed=false; + + //Check presence of modern IExplorerCommand-based shell extension and handle things accordingly + TRegistry* ModernReg = new TRegistry; + ModernReg->RootKey = HKEY_CLASSES_ROOT; + try { + //If modern shell extension is installed + if (ModernReg->OpenKeyReadOnly(__T("PackagedCom\\ClassIndex\\{20669675-B281-4C4F-94FB-CB6FD3995545}"))) { + LegacyShellExtension = 0; //Disable legacy shell extension + LegacyShellExtension_Folder = 0; //Disable legacy shell extension + ModernShellUsed = true; //Need to control modern shell extension + Config(__T("ShellExtension_Folder")) = __T("1"); //Disabling ShellExtension_Folder not implemented + ModernReg->CloseKey(); + } + } catch (...) {} + delete ModernReg; + + //Control modern IExplorerCommand-based shell extension + if (ModernShellUsed) { + TRegistry* ModernShellExtension = new TRegistry(KEY_WRITE); + try { + if (ModernShellExtension->OpenKey(__T("Software\\MediaArea\\MediaInfo"), true)) { + if (Config.Read(__T("ShellExtension")).To_int32s()) + ModernShellExtension->DeleteValue("ShellExtension"); + else + ModernShellExtension->WriteInteger("ShellExtension", 0); + ModernShellExtension->CloseKey(); + } + } catch (...) {} + delete ModernShellExtension; + } + bool IsChanged=false; if ( MajorVersion>=6 //Windows Vista or more || (MajorVersion==5 && MinorVersion>=1)) //WinXP or more in 5.x family @@ -863,22 +900,22 @@ int Preferences::ExplorerShell() ExplorerShell_Edit("SystemFileAssociations\\video", 0, IsChanged); //Adding/removing to SystemFileAssociations - int32s ShellExtension=Config.Read(__T("ShellExtension")).To_int32s(); + int32s ShellExtension=LegacyShellExtension; for (size_t I1=0; I1OpenKey(List(I1, 0).c_str(), ShellExtension)) diff --git a/Source/GUI/VCL/GUI_Preferences.cpp b/Source/GUI/VCL/GUI_Preferences.cpp index a2c2cdbca..e7b6abd4c 100644 --- a/Source/GUI/VCL/GUI_Preferences.cpp +++ b/Source/GUI/VCL/GUI_Preferences.cpp @@ -640,6 +640,17 @@ void __fastcall TPreferencesF::Setup_GeneralShow(TObject *Sender) CB_InscrireShell->Checked=Prefs->Config(__T("ShellExtension")).To_int32s(); //Lecture Shell extension CB_InscrireShell_Folder->Checked=Prefs->Config(__T("ShellExtension_Folder")).To_int32s(); //Lecture Shell extension CB_InfoTip->Checked=Prefs->Config(__T("ShellInfoTip")).To_int32s(); //Lecture Shell extension + + //Disable InscrireShell_Folder setting if modern IExplorerCommand-based shell extension is installed (not implemented) + TRegistry* ModernReg=new TRegistry; + ModernReg->RootKey = HKEY_CLASSES_ROOT; + try { + if (ModernReg->OpenKeyReadOnly(__T("PackagedCom\\ClassIndex\\{20669675-B281-4C4F-94FB-CB6FD3995545}"))) { + CB_InscrireShell_Folder->Enabled = false; + ModernReg->CloseKey(); + } + } catch (...) {} + delete ModernReg; } //---------------------------------------------------------------------------