Обычно у вас есть один 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 для каждого типа, все остальное немного хакерское или требует дополнительной работы для небольшой выгоды.