天天看點

用Shell擴充實作源代碼統計程式

<a href="http://www.vckbase.com/code/downcode.asp?id=2094">下載下傳源代碼</a>

用Shell擴充實作源代碼統計程式

 一、前言 

   在 Windows 的資料總管視窗中,我們見過 WinZIP,WinRAR 等軟體能在檔案或檔案夾的預設快捷菜單中添加幾個菜單項,它可以使使用者無須進入軟體内部而直接在視窗中進行壓縮/解壓操作,十分友善使用者操作,這無疑是一 個較好的應用模型,它就是我們所說的Shell擴充技術。本文将以一個普通的源代碼統計程式為例來說明怎樣實作Shell擴充技術。下面是程式的運作效果 圖:

用Shell擴充實作源代碼統計程式

圖一 示例代碼運作效果圖一

用Shell擴充實作源代碼統計程式

圖二 示例代碼運作效果圖二

用Shell擴充實作源代碼統計程式

 二、實作原理 

   為了在Windows的任何視窗中擴充檔案或檔案夾的預設菜單,我們必須使Windows在顯示快捷菜單加載我們的程式段,一般我們利用COM元件來達到 這個目的。COM元件分為三種:程序内服務程式,本地服務程式,以及遠端服務程式。要想讓explorer加載并執行我們的代碼,當然得使用程序内服務程 序,它的表現形式是DLL, DLL在加載後被映射到可執行程式的虛拟位址空間,我們向explorer提供一些接口,explorer将在顯示快捷菜單時調用它們時,我們可以在那些 接口中做一些我們想做的事,如添加快捷菜單,實作菜單項功能等等,進而實作Shell擴充了。? 

至于源代碼統計,則不難實作。這裡我以C/C++風格的源代碼為例,并應用一種最簡單的統計規則,當統計檔案時,我們将代碼内容讀入緩存,判斷每一個字元 是否為換行符(\n),若是,計數加1。當然我們是對檔案夾進行統計更有意義,是以我們可以使用遞歸的方法周遊檔案夾内所有檔案,找出有效檔案(這裡我僅 統計C/C++程式,是以隻處理字尾名為.C、.CPP、.H 的檔案),根據前面的方法一一統計即可求出檔案夾内所有代碼的總行數。 

用Shell擴充實作源代碼統計程式

 三、實作過程

1.建立一個VC工程,標明ATL COM AppWizard類型,工程起名為SrcCount,進入下一步;

2.選擇服務類型為DLL(預設選項)即可,這裡不需要MFC支援(若加入MFC支援的話,編寫代碼時會友善些,但程式失去ATL短小精悍的特點了,熊掌與魚不可兼得:)),進入下一步;

3.現在會顯示工程的配置資訊,我們按确定按鈕後就建立一個ATL COM元件了。

4.我們現在加入一個元件對象,在工程的快捷菜單上選擇New ATL Object…,在随後的對話框中的種類中選擇Simple Object,單擊下一步,在“Short Name”中填寫CountLines,Attributes屬性頁中按預設選項,單擊确定按鈕。我們可以在VC的工作區裡看到已添加一個接口ICountLines。

5.為該接口添加方法,在接口的快捷菜單上按右鍵,選擇Add method…,方法名為GetFileLines,它的參數分别為:[in]BSTR *pFilePath,[out]int *lines。它的作用是統計源代碼檔案的行數。下面是代碼的主要實作部分:

6.繼續添加方法GetFolderLines,它将根據遞歸算法對檔案夾裡的每個檔案進行代碼統計,這裡就不具體寫出了,請參看源代碼。

7.在CCountLines的基類中添加IShellExtInit、IContextMenu。

8.當浏覽器explorer.exe加載我們的程式段時,将調用IShellExtInit 接口初始化菜單,然後調用接口IContexMenu處理右鍵菜單,是以我們将在DLL元件中暴露以上接口。這隻需要在BEGIN_COM_MAP()與 END_COM_MAP()宏中加入接口即可。

9.Windows視窗初始化快捷菜單時調用IShellExtInit接口的Initialize ()方法,函數原型如下:

我們将在這個函數裡進行必要的初始化動作,例如儲存檔案名的完整路徑,儲存系統資料庫的鍵值等。

10.浏覽器調用IContexMenu接口進行指令的解釋執行,這是我們進行源代碼統計的主要部分,我們将調用以上的算法對所標明的檔案夾按照約定的規則進行代碼統計。這個接口主要有以下三個方法需要實作:  

這裡僅舉例 InvokeCommand()的實作,其他請看源代碼。

 四、其它 

   本程式是程序内服務程式,運作regsvr32進行注冊(注:在VC編譯器中,COM元件在編譯時會自動調用regsvr32 進行注冊,請看工程配置檔案),例如,該元件已COPY至C:\WinNT\System32下,我們将輸入如下指令行注冊: 

圖三 示例代碼運作效果圖三

因為是對檔案夾統計,是以還需在

下建立一項,命名為SrcCount,它的預設鍵值是元件的GUID,這裡為:

    現在在資料總管裡對檔案夾按快捷菜單,看到了嗎,多出一菜單項了:源代碼統計…,當我們單擊該項時即可進行代碼統計。 

   本程式主要是展示怎樣使用Shell擴充,是以重點在于程式設計方法,并未對所有細節的地方做得盡善盡美。還有一些細節值得改進,如Shell擴充菜單的 美化效果(例如比較流行的軟體WinZIP、WinRAR之類的界面效果,快捷菜單上繪出位圖)還可以改進;此外,程式的功能可以進一步擴充,本文主要是 對C/C++源代碼進行統計,我們可以擴充相關的統計規則,可以對彙編、JAVA、Delphi等各種語言的源代碼進行統計,還可以用對話框的形式讓使用者 進行各種選擇與設定統計規則等。有興趣的朋友可以一試。 

   本程式雖在Windows XP、VC++6.0下編譯,但可适用于Windows 9X/NT/2000/XP, 本文簡單地簡介了Shell擴充技術的實作方法,若有語焉不詳的地方,請參考本文所附的源代碼,或者發電子郵件給我,我們一起交流。

 五、參考資料

1. MSDN, Microsoft Corp.

繼續閱讀