WEB开发网
开发学院软件开发VC 用Shell扩展实现源代码统计程序 阅读

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

上一页  1 2 3 

Tags:Shell 扩展 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接