首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Shell 擴展實戰:右鍵選單整合原始碼行數統計工具

     編輯:關於VC++

WinRAR/WinZip 在資源管理器右鍵選單加入「解壓縮」選項的便利體驗,源於 Shell Extension(殼擴展) 技術。本文以原始碼行數統計工具為例,完整演示如何開發一個 進程內 COM DLL,掛載至資源管理器,對資料夾/檔案右鍵選單新增「原始碼統計」功能,遞迴統計 C/C++ 檔案行數。

架構原理

  • Explorer 載入進程內 COM 伺服器(DLL),映射至其位址空間。
  • 實作 IShellExtInit(初始化,取得選取項路徑)與 IContextMenu(建立/處理右鍵選單)介面。
  • 註冊至 HKEY_CLASSES_ROOT\Directory\Shellex\ContextMenuHandlers,即對「資料夾」生效。

開發步驟 (ATL COM 專案)

1. 建立 ATL DLL 專案

AppWizard → ATL COM AppWizard → 專案名 SrcCount → 服務類型 DLL(不勾選 MFC,保持輕量)。

2. 新增簡單物件 CountLines

介面 ICountLines 定義兩方法:

GetFileLines(BSTR* pFilePath, int* lines);   // 單檔統計
GetFolderLines(BSTR* pFolderPath, int* lines); // 遞迴資料夾統計

3. 核心統計邏輯

單檔: 讀檔 → 掃描 \n 計數(簡易規則,僅示範)。

STDMETHODIMP CCountLines::GetFileLines(BSTR* pFilePath, int* lines)
{
    HANDLE hFile = CreateFile((TCHAR*)pFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) { *lines = -1; return S_FALSE; }
    DWORD size = GetFileSize(hFile, NULL);
    BYTE* buf = new BYTE[size];
    DWORD read; ReadFile(hFile, buf, size, &read, NULL);
    int total = 0;
    for (DWORD i=0; i

資料夾: FindFirstFile/FindNextFile 遞迴遍歷,過濾 .c/.cpp/.h 副檔名,累加單檔結果。

4. 實作 Shell 擴展介面

在 COM Map 加入:

COM_INTERFACE_ENTRY(IShellExtInit)
COM_INTERFACE_ENTRY(IContextMenu)

IShellExtInit::Initialize

從 LPDATAOBJECT 擷取選取項完整路徑(CF_HDROP 格式),保存至成員變量 m_pszPath。

IContextMenu 三大方法

// 1. 新增選單項
QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
{
    InsertMenu(hmenu, indexMenu, MF_BYPOSITION, idCmdFirst, _T("原始碼統計(&S)..."));
    return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 1); // 1 個項目
}

// 2. 狀態列提示文字
GetCommandString(UINT idCmd, UINT uFlags, UINT* pwReserved, LPSTR pszName, UINT cchMax)
{
    if (uFlags == GCS_HELPTEXT) lstrcpy(pszName, "統計資料夾內 C/C++ 原始碼行數");
    return S_OK;
}

// 3. 執行命令
InvokeCommand(LPCMINVOKECOMMANDINFO pici)
{
    // 驗證命令 ID(支援 ANSI/Unicode 雙模式)
    // 顯示等待游標 → 呼叫 GetFolderLines → 彈出 MessageBox 顯示結果 → 還原游標
}

部署與註冊

  1. 編譯產生 SrcCount.dll,複製至 C:\Windows\System32(或任意目錄)。
  2. 管理員權限執行:regsvr32 SrcCount.dll(VC 建置事件可自動化)。
  3. 在 HKEY_CLASSES_ROOT\Directory\Shellex\ContextMenuHandlers\ 新建項 SrcCount,預設值設為元件 GUID:{548773BA-874E-4C02-9DC7-B7A096772C7D}。

右鍵選單效果 統計結果對話框 regsvr32 註冊截圖

擴展方向

  • 選單圖示化(IContextMenu2/3、Owner-draw)參考 WinRAR 風格。
  • 支援更多語言(Java、C#、Python...)與可配置規則對話框。
  • 輸出詳細報表(CSV/HTML)而非僅彈窗。

專案在 VC6/XP 下編譯通過,相容 Win9x/NT/2000/XP。完整原始碼附件下載。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved