注册上下文菜单Handler
上下文菜单与文件类或者文件夹相关联。对于文件类,handler注册在文件类的HKEY_CLASSES_ROOT\ProgID\Shellex\ContextMenuHandlers子键下。在ContextMenuHandlers下创建一个以handler子键,把子键的缺省值设置为handler的CLSID的字符串值,就可以完成注册。
也能够把handler关联到文件夹,注册的方法与上面类似,不过是在HKEY_CLASSES_ROOT\FolderType\Shellex\ContextMenuHandlers增加子键, 其中的FolderType 是文件夹类型的名称。
如果一个文件类有上下文菜单与它关联,那么双击一个对象将自动启动缺省的命令,而不会调用handler的QueryContextMenu方法。当对象被双击时,为了指定调用handler的QueryContextMenu方法,必须在handler的CLSID键下创建一个ShellEx\MayChangeDefaultMenu的子键。这样,当与handler关联的对象被双击时,QueryContextMenu 被调用,而且uFlags参数会包含CMF_DEFAULTONLY 标志。
注意,如果设置了MayChangeDefaultMenu键,当一个关联的项目被双击时,会强制系统载入handler的DLL。如果handler不改变缺省动作,就不应该设置MayChangeDefaultMenu,否则会引起系统不必要地载入这个DLL。仅仅当在可能改变上下文菜单的缺省动作时,才应该在设置上下文菜单handler的这个值。
创建工程
作为Borland的产品,用C++ Builder创建shell扩展的过程与Delphi有类似之处,但它毕竟是C++语言,所以也有与VC类似之的地方。
1. 选择File菜单的New菜单项,翻到New Items对话框的ActiveX页,双击ActiveX Library项,创建一个新的COM工程,把工程命名为MyContextMenu。从New Items 对话框的ActiveX页选择COM Object项,将打开COM Server向导。把"COClass"改为AddContextMenu,选择Apartment线程模式。其它不要改写。C++ Builder自动产生一个接口和一个类。默认的类名是TAddContextMenuImpl,采用自动生成的IAddContextMenu接口。我们必须自己添加新的接口IShellExtInit和IContextMenu,如下所示,粗体是添加的内容:
#include // 声明IShellExtInit和IContextMenu的头文件
class ATL_NO_VTABLE TAddContextMenuImpl :
public CComObjectRootEx,
public CComCoClass,
public IShellExtInit,
public IContextMenu,
public IAddContextMenu
{
private:
char g_szFilePath[MAX_PATH];
public:
… …
BEGIN_COM_MAP(TAddContextMenuImpl)
COM_INTERFACE_ENTRY(IAddContextMenu)
COM_INTERFACE_ENTRY(IContextMenu) // 导出IContextMenu接口
COM_INTERFACE_ENTRY(IShellExtInit) // 导出IShellExtInit接口
END_COM_MAP()
… …
};
|
<<上一页
1
2
3
4
5
下一页>>