Не удается загрузить расширение пространства имен оболочки в Windows 7
В настоящее время я пытаюсь создать собственное расширение пространства имен оболочки (для представления виртуальной папки, содержащей "подпапки" и "файлы", которые на самом деле представляют данные в иерархической древовидной структуре удаленной службы).
Расширение написано на C#, что, как мне известно, было плохой идеей, но с тех пор, как в.NET 4 появилась возможность сосуществования разных версий среды выполнения.NET в одном и том же процессе, я понял, что это ограничение больше не существует. проблема.
До сих пор я добился того, чтобы он работал нормально в Windows XP, следуя множеству примеров и ссылок, доступных в Интернете, но когда я пробую это в Windows 7 (я еще не пробовал в Vista, поэтому я не знаю, это будет работать там), расширение не загружается. Согласно моему выводу журнала отладки, он регистрируется нормально, но когда я открываю окно проводника Windows, кажется, что не происходит ни одного из обычных вызовов COM-интерфейсов (обычно начиная с IPersistFolder::Initialize). На самом деле, даже не вызывается конструктор класса. Я не знаю, запрашиваются ли интерфейсы (успешно или нет), потому что я не уверен, как обнаружить это в.NET, чтобы я мог зарегистрировать его. Так что, по сути, у меня нет никаких улик, потому что это не удается даже до того, как я получу возможность записать любую полезную информацию о том, что может пойти не так.
Кто-нибудь случайно понял, в чем проблема? Есть ли какие-то особенности в Windows 7 по сравнению с Windows XP, которые необходимо учитывать при работе с расширениями пространства имен оболочки, о которых мне следует знать? Если требуется более подробная информация, не стесняйтесь спрашивать (я старался быть кратким, потому что я уверен, что никто не оценит, чтобы я скопировал и вставил весь мой код здесь, и я не мог сократить его только до соответствующих частей, потому что я просто не знаю, какие это...)
3 ответа
У меня был очень похожий случай только сейчас:
- Я увидел расширение моей оболочки в нужном месте (в моем случае "Мой компьютер"), значок и все.
- Тем не менее, в моем классе COM не было выполнено ни одного экземпляра (я проверил монитор процесса) и не был вызван IPersistFolder::Initialize.
Я использовал ATL и 64 бит, поэтому я знал, что.NET не моя проблема.
Оказывается, проблема была в том, что у меня не было следующего значения в реестре: [HKEY_CLASSES_ROOT\CLSID\{your CLSID}\ShellFolder] "Атрибуты" = dword: 20000000
(Недостаточно, чтобы существовал ключ или значение - вам нужно иметь (как минимум) это конкретное значение атрибута, чтобы что-то начать).
После того, как вы добавите его, вам нужно убить все процессы explorer.exe и запустить его заново (например, с помощью диспетчера задач). Надеюсь, это тоже решит твою проблему.
Это может быть связано со следующими причинами:
Есть ли в вашем пространстве имен какие-либо зависимости, которые могут не загружаться?
Регистрация прошла успешно? Вы действительно проверили реестр, если правильные записи созданы? Помните, что если UAC включен, вам могут потребоваться повышенные привилегии.
В качестве альтернативы самостоятельной разработке таких сложных зверей рассмотрите возможность использования EZNamespaceExtensions - это очень просто, и вы можете сосредоточиться на предоставлении своей специфической для nse функциональности.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Мы являемся разработчиками EZNamespaceExtensions.
Спасибо @Oren, для меня проблема заключалась в том, что мне нужно было удалить все другие версии в следующей записи regedit: HKEY_CLASSES_ROOT\CLSID{ваш CLSID}\InprocServer32\
Я только оставил текущую версию. Я думаю, проблема заключалась в том, что у меня был номер версии, который был выше, чем моя текущая версия.
Добавить; Я должен был сделать то же самое и больше к другому компьютеру, у которого была похожая проблема. Я удалил все остальные версии из HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID{ваш CLSID}\InprocServer32\