我想以编程方式确定我的 shell 扩展是作为上下文菜单处理程序还是拖放处理程序调用。我已经使用相同的 CLSID 在适当的位置注册了我的外壳扩展。
注册表:
[HKEY_CLASSES_ROOT*shellexContextMenuHandlers{E991C840-C1EB-455C-AD64-282473005C58}]
@="Test Context Menu"
[HKEY_CLASSES_ROOTDirectoryshellexDragDropHandlersTestDragDrop]
@="{E991C840-C1EB-455C-AD64-282473005C58}"
我对注册表没有问题,我的扩展已加载。
我认为最好的检查位置是在DllGetClassObject或IShellExtInit::Initialize中。
你可以检测shell只想在IShellExtInit.Initialize中工作的扩展类型。对于上下文菜单处理程序,pidlFolder 为零,对于拖放处理程序,pidlFolder 是文件夹的 PIDL。
多个扩展使用相同的 CLSID,则它不知道正在实例化哪个扩展,除非在系统查询 IContextMenu
时可能QueryInterface()
。 如果你真的需要区分,最好只使用单独的CLSID,就像Raymond Chen说的那样。 它们可以映射到同一个 DLL,但这会使您的代码有机会知道正在实例化哪个 CLSID。