确定是否将shell扩展调用为上下文菜单处理程序或drag-n-drop处理程序

时间:2014-03-06 14:29:19

标签: c windows winapi windows-shell shell-extensions

我想以编程方式确定我的shell扩展是否被称为上下文菜单处理程序拖放处理程序。我已在适当的位置使用相同的CLSID注册了我的shell扩展。

注册表:

[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\{E991C840-C1EB-455C-AD64-282473005C58}]
@="Test Context Menu"

[HKEY_CLASSES_ROOT\Directory\shellex\DragDropHandlers\TestDragDrop]
@="{E991C840-C1EB-455C-AD64-282473005C58}"

我没有注册表问题,我的扩展程序已加载。

我认为最好检查的地方是 DllGetClassObject IShellExtInit :: Initialize

2 个答案:

答案 0 :(得分:3)

您可以检测shell只想在IShellExtInit.Initialize中工作的扩展类型。对于上下文菜单处理程序pidlFolder为零,对于拖放处理程序,pidlFolder是文件夹的PIDL。

答案 1 :(得分:0)

如果对多个扩展使用相同的CLSID,则它不知道正在实例化哪个扩展,除非在系统查询QueryInterface()时可能在IContextMenu中。如果你真的需要区分,最好只使用单独的CLSID,就像Raymond Chen说的那样。它们可以映射到相同的DLL,但这使您的代码有机会知道正在实例化哪个CLSID。