// 释放缓冲区
delete []lpBuffer;
CloseHandle(hFile);
// 保存代码行数
*lines = totalLine + 1; ?
return S_OK;
}
6.继续添加方法GetFolderLines,它将根据递归算法对文件夹里的每个文件进行代码统计,这里就不具体写出了,请参看源代码。
7.在CCountLines的基类中添加IShellExtInit、IContextMenu。
8.当浏览器explorer.exe加载我们的程序段时,将调用IShellExtInit 接口初始化菜单,然后调用接口IContexMenu处理右键菜单,所以我们将在DLL组件中暴露以上接口。这只需要在BEGIN_COM_MAP()与 END_COM_MAP()宏中加入接口即可。
9.Windows窗口初始化快捷菜单时调用IShellExtInit接口的Initialize ()方法,函数原型如下:
HRESULT Initialize(LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj, HKEY hkeyProgID );我们将在这个函数里进行必要的初始化动作,例如保存文件名的完整路径,保存注册表的键值等。
10.浏览器调用IContexMenu接口进行命令的解释执行,这是我们进行源代码统计的主要部分,我们将调用以上的算法对所选定的文件夹按照约定的规则进行代码统计。这个接口主要有以下三个方法需要实现:
// 在视窗的状态栏上显示命令说明,这里值得注意的是,我们需要对ASCII码和UNICODE码进行处理,// 以适应不同系统。HRESULT GetCommandString( UINT idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax );// 执行菜单明命令,在此可以实现具体的功能。 HRESULT InvokeCommand( LPCMINVOKECOMMANDINFO pici );// 在这里增加快捷菜单HRESULT QueryContextMenu( HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
这里仅举例 InvokeCommand()的实现,其他请看源代码。
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// 作用:执行快捷菜单命令
// 参数:1. pici:包含命令信息的结构体?
HRESULT CCountLines::InvokeCommand(LPCMINVOKECOMMANDINFO pici){
BOOL bEx = FALSE;
BOOL bUnicode = FALSE;
if (pici->cbSize = sizeof(CMINVOKECOMMANDINFOEX))
{
bEx = TRUE;
if ((pici->fMask & CMIC_MASK_UNICODE))
{
bUnicode = TRUE;
}
}// lpVerb参数有两种标识:如高位字非0,则为命令字串,否则低位提供了快捷菜单的偏移值。
if (!bUnicode && HIWORD(pici->lpVerb))
{
if(StrCmpIA(pici->lpVerb, "Stat."))
{
return E_FAIL;
}
}
责任编辑:cyth