Перезагрузите расширение пространства имен в explorer.exe, который не удалось загрузить ранее

Фон

У меня есть расширение пространства имен оболочки, которое расположено ( используя виртуальную папку в качестве точки соединения) под MyComputer. Можно создать ярлык для моего расширения пространства имен. Здесь я показываю свое расширение пространства имен с помощью ярлыка на рабочем столе.

Изображение, показывающее расширение пространства имен в разделе

Если мое расширение пространства имен не установлено, ярлык, который я создал при его установке, будет не разрешен, как ожидалось.

Изображение, показывающее расширение пространства имен, не установленное и неразрешенный ярлык

Когда мое приложение запускается, оно устанавливает мое расширение пространства имен в реестр. Когда он выходит, он удаляет расширение пространства имен из реестра. Это необходимо для моего приложения, потому что dll, загруженная для представления моего расширения пространства имен, может отличаться при каждом запуске в зависимости от конфигурации.

Проблема

Когда мое приложение не запущено, а explorer.exe встречает ярлык для моего (в настоящее время не установленного) расширения пространства имен, он пытается найти в реестре компонент COM (ярлык содержит идентификатор COM для моего расширения пространства имен)- я заметил это через Process Monitor. Позже, когда мое приложение запускается, мое расширение пространства имен добавляется в "Мой компьютер", как и ожидалось, но оно не функционирует - то есть, попытка просмотреть его (двойной щелчок) не работает как обычно (ничего не делает), Мои наблюдения через Process Monitor показывают, что explorer.exe не пытался загрузить мое расширение пространства имен. Кажется, что explorer.exe помнит, что ему не удалось загрузить COM-компонент для моего расширения пространства имен, и поэтому он не будет повторять попытку. Симптомы в этом состоянии:

  • Ярлык отображается как неразрешенный

  • Расширение пространства имен отображается в разделе "Мой компьютер", но двойной щелчок по нему не работает.

  • Расширение пространства имен не отображается на левой навигационной панели

Изображение, показывающее, как это выглядит, когда расширение пространства имен не работает

Единственный путь, который я нашел, чтобы решить проблему, как только я нахожусь в этом состоянии, это перезапустить explorer.exe.

Вопрос

Есть ли способ заставить explorer.exe повторить попытку загрузки моего расширения пространства имен, если оно уже не удалось загрузить его один раз (из-за неразрешенного сокращения) без перезапуска explorer.exe?

Пример

Вот краткий обзор того, как создать и наблюдать проблему с нуля. Это включает использование "встроенного" расширения пространства имен Microsoft, называемого объектом экземпляра оболочки (а не моего реального расширения пространства имен). Я использовал это для простоты, а также чтобы показать, что это не связано с моим конкретным расширением пространства имен. Все это примерное расширение пространства имен создает значок в разделе "Мой компьютер", который просматривает каталог%TEMP%.

  1. Установите расширение пространства имен и зарегистрируйте его в разделе "Мой компьютер". Для этого введите в реестр следующее:

    HKEY_CURRENT_USER\Software\Classes\CLSID
    
      {0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}=REG_SZ_EXPAND:"My Namespace Extension"
        DescriptionID=REG_DWORD:0x00000008
        System.IsPinnedToNameSpaceTree=REG_DWORD:0x00000001
        DefaultIcon=REG_EXPAND_SZ:"%SystemRoot%\system32\main.cpl,9"
        InProcServer32=REG_EXPAND_SZ:"%SystemRoot%\system32\shdocvw.dll"
          ThreadingModel=REG_SZ:"Apartment"
        ShellFolder
          Attributes=REG_DWORD:0x60000000
        Instance
          CLSID=REG_SZ:"{0AFACED1-E828-11D1-9187-B532F1E9575D}"
          InitPropertyBag
            Attributes=REG_DWORD:0x00000011
            Target=REG_SZ_EXPAND:"%TEMP%"
    

    Вот файл.reg, который автоматизирует это для вас:

    Windows Registry Editor Version 5.00
    
    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
    @="My Namespace Extension"
    "System.IsPinnedToNameSpaceTree"=dword:00000001
    "DescriptionID"=dword:00000008
    
    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\DefaultIcon]
    @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
      00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,61,00,\
      69,00,6e,00,2e,00,63,00,70,00,6c,00,2c,00,39,00,00,00
    
    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\InProcServer32]
    @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
      00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,00,68,00,\
      64,00,6f,00,63,00,76,00,77,00,2e,00,64,00,6c,00,6c,00,00,00
    "ThreadingModel"="Apartment"
    
    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\Instance]
    "CLSID"="{0AFACED1-E828-11D1-9187-B532F1E9575D}"
    
    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\Instance\InitPropertyBag]
    "Attributes"=dword:00000011
    "Target"=hex(2):25,00,54,00,45,00,4d,00,50,00,25,00,00,00
    
    [HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\ShellFolder]
    "Attributes"=dword:60000000
    
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
    @="My Namespace Extension"
    
  2. На этом этапе, когда вы открываете окно обозревателя и перемещаетесь по "Моему компьютеру", вы должны увидеть "Расширение моего пространства имен". Просмотр в нем должен показать ваши папки / файлы%TEMP%.

  3. Создайте ярлык на рабочем столе для "Моего расширения пространства имен", перетащив "Мое расширение пространства имен" на рабочий стол.

  4. Полностью удалите регистрацию расширения пространства имен из реестра. Это можно сделать, удалив указанные выше ключи вручную или запустив следующий файл.reg:

    Windows Registry Editor Version 5.00
    
    [-HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
    
    [-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
    
  5. Перезапустите explore.exe на этом этапе (или перезагрузите компьютер). Когда запускается explorer.exe, он пытается разрешить ярлык на рабочем столе. При этом он попытается найти COM-компонент в HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}, но это будет невозможно. Откройте окно обозревателя "Мой компьютер" и убедитесь, что "Расширение пространства имен" не существует. Также обратите внимание, что ярлык отображается как неразрешенный.

  6. Переустановите расширение пространства имен, повторно применив изменения реестра, начиная с шага 1.

  7. Обновите окно "Мой компьютер". В этот момент вы окажетесь в проблемном состоянии, в котором вы можете увидеть расширение пространства имен в разделе "Мой компьютер", но попытка просмотреть его не работает.

  8. Если вы перезапустите файл explorer.exe на этом этапе, проблема исчезнет. Это связано с тем, что когда explorer.exe пытается разрешить ярлык, он может загрузить COM-компонент расширения пространства имен, поскольку он в настоящее время зарегистрирован в реестре.

Дополнительные примечания

  • Мое настоящее расширение пространства имен написано на C++.

  • Я использую SHChangeNotify, чтобы расширение пространства имен появлялось / исчезало в разделе "Мой компьютер", не требуя обновления вручную, но это не приводит к попытке перезагрузки расширения пространства имен.

  • Возможно, что удивительно, расширения пространства имен, которые зарегистрированы с использованием метода desktop.ini с.ShellClassInfo и CLSID, похоже, не страдают от этой проблемы. К сожалению, я не могу использовать этот подход, так как мне нужно, чтобы мое расширение пространства имен находилось в разделе "Мой компьютер".

1 ответ

Решение

Вы должны порыться в документации по Shell довольно много (всегда рутина), чтобы найти SHFlushSFCache(),

SHFlushSFCache вызывается при изменении пути к специальной папке. Это гарантирует, что используется обновленный путь, сохраненный в реестре, а не кэшированное значение.

К сожалению, эта процедура помечена как "устаревшая", но она все еще работает в Windows 10.

Вызов SHFlushSFCache() после (пере) регистрации вашего пространства имен; это должно заставить explorer.exe перезагрузить его.

Другие вопросы по тегам