Подтвердить что ты не робот

Как написать расширение оболочки в С++?

Это казалось обычным вопросом, но после некоторых поисков я не смог найти ответы. Здесь есть статья:

http://www.codeproject.com/KB/shell/shellextguide1.aspx

Но это для очень старой версии Visual Studio. Я использую VS 2008, поэтому инструкции и интерфейсы, похоже, не соответствуют тому, что я вижу.

Я хочу создать простое расширение оболочки, используя С++, который создает контекстное меню для файлов с расширением .GZ. При щелчке правой кнопкой мыши по этим файлам я должен щелкнуть мышью по элементу контекстного меню и вызвать обратный вызов в коде для выполнения какой-либо операции над этим файлом.

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

Из того, что я видел, ATL используется для этого, но я никогда не использовал ATL, поэтому все типы объектов и интерфейсы меня очень сбивают с толку. Это было бы не так плохо, если бы у меня был подходящий учебник или документация для чтения.

Может ли кто-нибудь помочь мне? Не существует ли какой-то учебник, которому не исполнилось 10 лет?

4b9b3361

Ответ 1

Я не могу точно сказать, как написать расширение оболочки, но я предоставлю несколько советов. Написание расширения оболочки имеет ряд существенных преимуществ по сравнению с гораздо более простым методом "только для реестра":

  • С расширением Shell вы можете динамически создавать элемент контекстного меню (или подменю), который более подходит для выбранного файла (ов). Например, если вы пишете расширение оболочки для zip файлов, можно создать подменю в контекстном меню, которое отображает все содержимое zip.
  • Вы можете обрабатывать несколько файлов одновременно, что может быть более полезным не только для целей производительности, но и для того, чтобы вы могли решить, что делать на основе выбора в целом, а не только для каждого файла.

Некоторые из проблем, связанных с расширением оболочки, заключаются в следующем:

  • Существенно повышенная сложность. Будьте готовы потратить на это много усилий, чтобы заставить его работать. У вас есть домашняя эспрессо-машина рядом с вашим компьютером и/или нанять кого-то, чтобы приготовить вам кофе.

  • Значительно большая сложность в отладке. Тоже о кофе.

Сложно написать расширение оболочки, потому что их можно очень сложно отладить.

  • Расширения оболочки загружаются процессом explorer.exe, и без конкретной конфигурации проводника вам необходимо принудительно завершить процесс explorer.exe, чтобы вы могли установить более новую версию расширения вашей оболочки. Существует способ заставить Explorer выгружать библиотеки DLL, которые он больше не использует, но вы должны делать это только на машине разработки, а не на цели развертывания:

    • В RegEdit перейдите к следующему ключу:

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer,

    • Добавьте новый ключ DWORD под названием AlwaysUnloadDLL и установите его значение равным 1.

    • Перезагрузите проводник.

    Это работает большую часть времени, но все же могут быть моменты, когда вам нужно закрыть Explorer, потому что расширение оболочки не было выгружено.

  • Имейте в виду, что расширение вашей оболочки может быть загружено другими приложениями, например, если вы щелкнете правой кнопкой мыши по файлу с диалоговым окном "открыть файл" приложений, тогда расширение оболочки будет загружено в это приложение, а не Explorer.

  • Если расширение Shell вызывает ошибку времени выполнения, довольно часто результат просто будет заключаться в том, что ваш пункт контекстного меню не отображается, очень редко вам сообщают, что расширение оболочки не удалось загрузить или что оно вызвало ошибку времени выполнения.
  • Конфигурация может быть сложной, даже при установке, данные реестра должны быть созданы в нескольких местах и ​​в зависимости от того, где вы хотите, чтобы ваше контекстное меню показывалось, места в реестре могут отличаться в разных версиях Windows.

Что вам нужно сделать:

  • Visual Studio предлагает несколько ярлыков для создания расширений оболочки, но в основном вам нужно создать COM-DLL. Расширение оболочки для элементов контекстного меню должно реализовывать интерфейс IContextMenu и IShellExtInit.
  • В методе IShellExtInit::Initialize() вы можете получить выбранные файлы из параметра IDataObject. Из памяти данные находятся в формате "Drag-n-Drop", поэтому вам нужно получить дескриптор HDROP из IDataObject и запросить файлы оттуда (это из памяти, оно может фактически отличаться от Я описал здесь, поэтому продолжайте с осторожностью).
  • После того как ваша DLL готова к установке, вы должны ее скопировать, а затем запустите regsvr32, чтобы убедиться, что она зарегистрирована.
  • Следуйте этому руководству, чтобы узнать, где поставить ключи реестра.
  • Возможно, возникли проблемы с 64-разрядной Windows, если вы создаете 32-разрядную DLL, которую она не может загружать в 64-разрядный Explorer & hellip; поэтому имейте это в виду, если у вас возникли проблемы с 64-разрядной Windows.
  • В вашей DLL будет фактически два идентификатора GUID, связанных с ним. Я точно не помню, как это работает, но один GUID относится к самой DLL, а другой относится к фактическому расширению оболочки. Убедитесь, что вы используете GUID фактического расширения оболочки при создании ключей в реестре, где требуется идентификатор GUID.

Все рассмотренные вещи & hellip; (Tl; дг)

Взвесьте расходы на то, стоит ли Shell Extension. Если вы хотите динамически создавать элементы меню на основе выбранных файлов, расширение оболочки может быть единственным способом. Если вы хотите обрабатывать все файлы одновременно, вам также понадобится расширение оболочки.

Альтернативой методу контекстного меню может быть задача drag-n-drop на рабочем столе пользователя или что-то в этом роде. Изучите другие способы, с помощью которых пользователь может отправлять ваши файлы в приложение, потому что расширение оболочки часто намного больше, чем того стоит. Я нашел это трудным путем, и я думаю, что все остальные тоже.