Как зарегистрировать несколько обработчиков расширения оболочки - PullRequest
0 голосов
/ 25 мая 2019

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

Часть, которую я не понимаю, состоит в том, какзарегистрировать CLSID для проекта, который содержит несколько обработчиков.Каждый обработчик регистрируется, используя уникальный CLSID?Поскольку каждый раз, когда создается класс для нового обработчика в Visual Studio, мастер устанавливает его со своим собственным CLSID.Или есть способ направить их всех в мой проект, используя один CLSID?В игру входит ли typelib?

1 Ответ

1 голос
/ 25 мая 2019

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

Если у вас может быть один CLSID, зависит от того, сможете ли вы определить, какой у вас обработчик, только на основедля чего вы QueryInterface 'и как / если IShellExtInit::Initialize вызывается и т. д.

Если вы подумаете о том, как работает COM, оболочка вызовет CoCreateInstance(YourCLSID, ..., ISomething), и ваш .DLL создаст фабрику YourCLSIDи COM попросит эту фабрику создать экземпляр ISomething.

Если, например, ваш код C ++ выглядит так:

class AllMyHandlers : public IShellExtInit, public IInitializeCommand { ...

, то вы знаете, что если вызывается IInitializeCommand::Initialize, то вы, вероятно,* обработчик IExecuteCommand.Если вызывается IShellExtInit::Initialize, вы можете посмотреть параметры, чтобы определить тип вашего обработчика (но не каждая комбинация может быть обнаружена).

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

Другой подход заключается в поддержке всего (и под этим я имею в виду сохранение всех полезных входящих данных из всех методов Initialize) и определение типа только при перетаскивании одним из них./ Add / Execute методы вызываются, и вы точно знаете, какой у вас тип.

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

...