用Shell扩展实现源代码统计程序
2006-07-20 11:39:12 来源:WEB开发网核心提示: 作用:执行快捷菜单命令// 参数:1. pici:包含命令信息的结构体HRESULT CCountLines::InvokeCommand(LPCMINVOKECOMMANDINFO pici){BOOL bEx = FALSE;BOOL bUnicode = FALSE;?if (pi
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// 作用:执行快捷菜单命令
// 参数: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;
}
}
else if (bUnicode && HIWORD(((CMINVOKECOMMANDINFOEX *) pici)->lpVerbW))
{
if(StrCmpIW(((CMINVOKECOMMANDINFOEX *)pici)->lpVerbW, L"Stat."))
{
return E_FAIL;
}
}
else if (LOWORD(pici->lpVerb) != IDM_SRC_COUNT)
{
return E_FAIL;
}
else
{
assert(0 == HIWORD(pici->lpVerb));
int lines = 0;
TCHAR szTitle[MAX_PATH] = {0};
TCHAR szMsg[MAX_PATH] = {0};
TCHAR szFormat[MAX_PATH] = {0};
memset(szMsg, 0, MAX_PATH);
//保存当前光标并重设为等待形状
HCURSOR hOldCursor = GetCursor();??
HCURSOR hNewCursor = LoadCursor(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDC_COUNT_WAIT));
assert(hNewCursor);
SetCursor(hNewCursor);?
TCHAR szTemp[MAX_PATH] = {0};
LoadString(_Module.GetModuleInstance(), IDS_TOTAL_LINES, szFormat, MAX_PATH);
if (SUCCEEDED(GetFolderLines((BSTR *)&m_pszPath, &lines)))
{
wsprintf(szMsg, szFormat, (LPTSTR)m_pszPath, lines);
}
// 恢复默认光标形状
SetCursor(hOldCursor);
// 显示统计代码信息
LoadString(_Module.GetModuleInstance(), IDS_TITLE, szTitle, MAX_PATH);
MessageBox(pici->hwnd, szMsg, szTitle, MB_OK | MB_ICONINFORMATION);
}
return S_OK;
}
四、其它
本程序是进程内服务程序,运行regsvr32进行注册(注:在VC编译器中,COM组件在编译时会自动调用regsvr32 进行注册,请看工程配置文件),例如,该组件已COPY至C:\WinNT\System32下,我们将输入如下命令行注册:
图三 示例代码运行效果图三
因为是对文件夹统计,所以还需在
HKEY_CLASSES_ROOT\Directory\Shellex\ContextMenuHandlers\
下新建一项,命名为SrcCount,它的默认键值是组件的GUID,这里为:
{548773BA-874E-4C02-9DC7-B7A096772C7D}
现在在资源管理器里对文件夹按快捷菜单,看到了吗,多出一菜单项了:源代码统计…,当我们单击该项时即可进行代码统计。
本程序主要是展示怎样使用Shell扩展,所以重点在于程序设计方法,并未对所有细节的地方做得尽善尽美。还有一些细节值得改进,如Shell扩展菜单的美化效果(例如比较流行的软件WinZIP、WinRAR之类的界面效果,快捷菜单上绘出位图)还可以改进;此外,程序的功能可以进一步扩充,本文主要是对C/C++源代码进行统计,我们可以扩展相关的统计规则,可以对汇编、JAVA、Delphi等各种语言的源代码进行统计,还可以用对话框的形式让用户进行各种选择与设置统计规则等。有兴趣的朋友可以一试。
本程序虽在Windows XP、VC++6.0下编译,但可适用于Windows 9X/NT/2000/XP, 本文简单地简介了Shell扩展技术的实现方法,若有语焉不详的地方,请参考本文所附的源代码,或者发电子邮件给我,我们一起交流。
更多精彩
赞助商链接