Как мне начать писать расширение оболочки Windows? - PullRequest
3 голосов
/ 06 марта 2010

Я смотрю на написание расширения оболочки, чтобы при щелчке файла можно было выполнить действие с ним. (Как и любое другое контекстное меню:))

Какой минимум мне нужен, чтобы вставить новый пункт меню в контекстное меню и выполнить действие с одним или несколькими файлами. Сравнительный пример: я выбрал 10 файлов и отправил их в Zip.

Я прочитал, что написание некоторого неуправляемого кода требуется, но мои знания неуправляемого кода на c ++ равны нулю, поэтому я хочу сделать как можно меньше, чтобы получить пункт меню в контекстном меню Windows (Файл> Правый клик). После этого я хочу вызвать консольное приложение C # для выполнения основной обработки, поэтому можно ли вызвать консольное приложение c # из неуправляемого кода?

Кроме того, какой тип проекта Visual Studio мне понадобится для создания программы Windows Shell? Какой тип проекта выбрать:

  • Консольное приложение Win32
  • Приложение MFC
  • Проект Win32
  • ATL Project
  • MFC DLL
  • Консольное приложение CLR
  • Библиотека классов
  • Makefile Project
  • Управление MFC ActiveX
  • Библиотека управления Windows Forms

Приветствия

Ответы [ 4 ]

5 голосов
/ 06 марта 2010

Эта статья MSDN поможет вам начать работу.

Ваш подход порождения процесса (написанного в управляемом коде) для выполнения фактической работы расширения оболочки должен быть в порядке. Я бы предложил просто передать выбранные файлы в качестве параметров командной строки через CreateProcess .

Что касается типа проекта, вам нужно будет создать библиотеку динамических ссылок Win32 (DLL). Под 2005 существует тип проекта Win32 Dll. В 2008 году (который я предполагаю, что вы используете) вы должны создать проект Win32, а затем выбрать DLL в качестве типа приложения в появившемся мастере.

3 голосов
/ 06 марта 2010

Хотя невозможно написать расширение оболочки полностью в управляемом коде (я это сделал), это не рекомендуется по ряду причин, но самое большое - это расширения оболочки внутрипроцессные, что означает, что проводник должензагрузите весь CLR в его собственное адресное пространство, и, боже, помогите, если у вас есть два расширения, написанных для разных версий CLR.

Кроме того, для такой маленькой функции очень много работы.Поэтому лучше написать его на C ++, так как для этого есть множество инструментов, включая Active Template Library (ATL).

2 голосов
/ 06 марта 2010

Если у вас нет опыта работы с C ++ в Windows и COM, расширение оболочки, вероятно, будет не самым легким проектом.

Вы уверены, что вам действительно нужно написать расширение оболочки?

Вы можете легко добавить новую опцию меню через реестр ( см. Здесь пример ) и установить «команду» этой опции для вашего исполняемого файла C #.

Вы можете передать выбранный файл процессу, используя команду %1 в пути.

Пример записи реестра для всех файлов:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\\*\shell\SomeCmd]
@="Do Some Cmd"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\\*\shell\SomeCmd\command]
@="\"Path to your app\\YourApp.exe\" \"%1\""

Обратите внимание на %1 в конце - это будет имя файла. Ограничение состоит в том, что вы фактически будете созданы один раз для каждого файла - что также произойдет с расширением. Как только запись реестра будет установлена, она будет там, пока вы не удалите ее.

0 голосов
/ 06 марта 2010

Вот один пример того, как вы можете использовать неуправляемый клиент с .NET: http://groups.google.com/group/codefactory/web/wcf-service-and-unmanaged-c-client

Да, вам придется писать неуправляемый код (C ++) для взаимодействия с Shell. Некоторые расширения оболочки написаны на C #, но это не рекомендуется даже Microsoft, так как загружает среду выполнения в пространство процесса Explorer. Вы можете найти много статей о проекте кода по написанию расширения ContextMenu. Он включает в себя написание COM-библиотеки, реализующей интерфейс IContextMenu, и соответствующую регистрацию в реестре.

...