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扩展技术的实现方法,若有语焉不详的地方,请参考本文所附的源代码,或者发电子邮件给我,我们一起交流。
责任编辑:cyth