Изменить категорию поставщика данных проводника

89
4

Как я могу изменить или установить категорию расширения моей оболочки на основе этого примера?

reference screenshot

На скриншоте расширение находится в категории More или в немецком Weitere.

спросил(а) 2011-12-26T16:07:00+04:00 8 лет, 9 месяцев назад
1
Решение
89

Все обработчики расширения Shell являются объектами объекта Component Object Model (COM). Им должен быть присвоен идентификатор GUID и зарегистрирован, как описано в разделе "Регистрация обработчиков расширений оболочки". Они реализованы как DLL и должны экспортировать следующие стандартные функции: DllMain. Стандартная точка входа в DLL. DllGetClassObject. Выдает объект класса объектов. DllCanUnloadNow. COM вызывает эту функцию, чтобы определить, обслуживает ли объект какие-либо клиенты. Если нет, система может выгрузить DLL и освободить связанную память. Как и все COM-объекты, обработчики расширения оболочки должны реализовывать интерфейс IUnknown и фабрику классов. Большинство из них также должны реализовать интерфейс IPersistFile или IShellExtInit в Windows XP или ранее. Они были заменены на IInitializeWithStream, IInitializeWithItem и IInitializeWithFile в Windows Vista. Оболочка использует эти интерфейсы для инициализации обработчика. Интерфейс IPersistFile должен быть реализован следующим образом:

    Обработчики иконок Обработчики данных Обработчики капель

Интерфейс IShellExtInit должен быть реализован следующим образом:

    Обработчики контекстного меню Обработчики перетаскивания Обработчики свойств свойств

Реализация IPersistFile Интерфейс IPersistFile предназначен для обеспечения возможности загрузки или сохранения объекта в файл на диске. Он имеет шесть методов в дополнение к IUnknown, пять из его собственных и метод GetClassID, который он наследует от IPersist. При использовании расширений Shell IPersist используется только для инициализации объекта обработчика расширения оболочки. Поскольку, как правило, нет необходимости читать или записывать на диск, только методы GetClassID и Load требуют выполнения нетока. Сначала оболочка вызывает GetClassID, и функция возвращает идентификатор класса (CLSID) объекта обработчика расширения. Затем оболочка вызывает Load и передает два значения. Первая, pszFile, представляет собой строку Юникода с именем файла или папки, в которой Shell собирается работать. Второй - dwMode, который указывает режим доступа к файлу. Поскольку обычно нет необходимости обращаться к файлам, dwMode обычно равен нулю. Метод сохраняет эти значения по мере необходимости для последующей ссылки. Следующий фрагмент кода иллюстрирует, как типичный обработчик расширения оболочки реализует методы GetClassID и Load. Он предназначен для обработки ANSI или Unicode. CLSID_SampleExtHandler - это GUID объекта обработчика расширения, а CSampleShellExtension - это имя класса, используемого для реализации интерфейса. Переменные m_szFileName и m_dwMode являются частными переменными, которые используются для хранения имени файла и флажков доступа.

class CSampleShellExtension : public IPersistFile
{
// Method declarations not included

private:
WCHAR m_szFileName[MAX_PATH]; // The file name
DWORD m_dwMode; // The file access mode
}

IFACEMETHODIMP CSampleShellExtension::GetClassID(__out CLSID *pCLSID)
{
*pCLSID = CLSID_SampleExtHandler;
}

IFACEMETHODIMP CSampleShellExtension::Load(PCWSTR pszFile, DWORD dwMode)
{
m_dwMode = dwMode;
return StringCchCopy(m_szFileName, ARRAYSIZE(m_szFileName), pszFile);
}

//Образец реализации продолжается в следующем разделе.

Реализация IShellExtInit Интерфейс IShellExtInit имеет только один метод: IShellExtInit :: Initialize, в дополнение к IUnknown. Метод имеет три параметра, которые Shell может использовать для передачи в различные типы информации. Пропущенные значения зависят от типа обработчика, а некоторые могут быть установлены в NULL. pidlFolder содержит указатель папки на список идентификаторов элементов (PIDL). Это абсолютный PIDL. Для расширений листа свойств это значение равно NULL. Для расширений контекстного меню это PIDL папки, которая содержит элемент, контекстное меню которого отображается. Для обработчиков перетаскивания без ограничений это PIDL целевой папки. pDataObject содержит указатель на интерфейс IDataObject объекта данных. Объект данных содержит одно или несколько имен файлов в формате CF_HDROP. hRegKey содержит раздел реестра для типа файла или папки. Метод IShellExtInit :: Initialize сохраняет имя файла, указатель IDataObject и раздел реестра, необходимые для последующего использования. Следующий фрагмент кода иллюстрирует реализацию IShellExtInit :: Initialize. Для простоты в этом примере предполагается, что объект данных содержит только один файл. В общем случае объект данных может содержать несколько файлов, каждый из которых необходимо будет извлечь.

 // This code continues the CSampleShellExtension sample shown in the
// "Implementing IPersistFile" section above.

class CSampleShellExtension : public IShellExtInit {
// Method declarations not included

private:
// IDList of the folder for extensions invoked on the folder, such as
// background context menu handlers or nondefault drag-and-drop handlers.
PIDLIST_ABSOLUTE m_pidlFolder;

// The data object contains an expression of the items that the handler is
// being initialized for. Use SHCreateShellItemArrayFromDataObject to
// convert this object to an array of items. Use SHGetItemFromObject if you
// are only interested in a single Shell item. If you need a file system
// path, use IShellItem::GetDisplayName(SIGDN_FILESYSPATH, ...).
IDataObject *m_pdtobj;

// For context menu handlers, the registry key provides access to verb
// instance data that might be stored there. This is a rare feature to use
// so most extensions do not need this variable.
HKEY m_hRegKey; }
// This method must be very efficient. Do not do any unnecessary work here.
// Use Initialize to acquire resources that will be used later.
IFACEMETHODIMP CSampleShellExtension::Initialize(__in_opt PCIDLIST_ABSOLUTEpidlFolder,__in_opt IDataObject *pDataObject, __in_opt HKEY hRegKey)
{
// In some cases,handlers are initialized multiple times. Therefore,
// clear any previous state here.
CoTaskMemFree(m_pidlFolder);
m_pidlFolder = NULL;

if (m_pdtobj)
{
m_pdtobj->Release();
}

if (m_hRegKey)
{
RegCloseKey(m_hRegKey);
m_hRegKey = NULL;
}

// Capture the inputs for use later.
HRESULT hr = S_OK;

if (pidlFolder)
{
m_pidlFolder = ILClone(pidlFolder); // Make a copy to use later.
hr = m_pidlFolder ? S_OK : E_OUTOFMEMORY;
}

if (SUCCEEDED(hr))
{
// If a data object pointer was passed into the method, save it and
// extract the file name.
if (pDataObject)
{
m_pdtobj = pDataObject;
m_pdtobj->AddRef();
}

// It is uncommon to use the registry handle, but if you need it,
// duplicate it now.
if (hRegKey)
{
LSTATUS const result = RegOpenKeyEx(hRegKey, NULL, 0, KEY_READ, &m_hRegKey);
hr = HRESULT_FROM_WIN32(result);
}
}

return hr; }

Каждый раз, когда вы создаете или изменяете обработчик расширения Shell, важно уведомить систему о том, что вы внесли изменения. Сделайте это, вызвав SHChangeNotify, указав событие SHCNE_ASSOCCHANGED. Если вы не вызываете SHChangeNotify, изменение может не распознаваться до перезагрузки системы. Существуют некоторые дополнительные факторы, которые применяются к системам Windows 2000. Подробнее см. В разделе "Регистрация обработчиков расширений оболочки" в разделе "Системы Windows 2000". Как и со всеми объектами Object Component Object Model (COM), вы должны создать GUID для обработчика с помощью инструмента, такого как Guidgen.exe, который поставляется с комплектом разработки программного обеспечения Windows (SDK). Создайте подраздел под HKEY_CLASSES_ROOT\CLSID, чье имя является строковой формой этого GUID. Поскольку обработчики расширения Shell являются встроенными серверами, вы также должны создать подраздел InprocServer32 в этом подразделе GUID с параметром (по умолчанию), заданным для пути к DLL обработчика. Используйте модель резьбы по квартире. Пример показан здесь:

 HKEY_CLASSES_ROOT    CLSID
{00021500-0000-0000-C000-000000000046}
InprocServer32
(Default) = %windir%\System32\Example.dll
ThreadingModel = Apartment

Каждый раз, когда Shell принимает действие, которое может включать обработчик расширения оболочки, он проверяет соответствующий подраздел реестра. Подкласс, под которым зарегистрирован обработчик расширения, управляет, когда он будет вызван. Например, обычной практикой является вызов обработчика контекстного меню, когда оболочка отображает контекстное меню для члена типа файла. В этом случае обработчик должен быть зарегистрирован под подразделением ProgID типа файла.

ответил(а) 2012-01-25T10:10:00+04:00 8 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема