在 Windows 系統程式設計中,對資料夾進行即時監控是許多安全軟體、備份工具及檔案管理程式的核心需求。Windows Shell 提供了 ICopyHook 介面,允許開發者在檔案夾或印表機物件發生移動、複製、重新命名或刪除等操作前介入驗證。本文將深入解析 ICopyHook 的工作原理、實作步驟,並提供一個基於 C++ Builder 6 的完整程式碼範例。
ICopyHook 是一個 COM 介面,僅包含一個關鍵方法 CopyCallback。當使用者嘗試對資料夾執行上述四種操作時,Shell 會在操作真正執行前呼叫此方法。開發者可在回呼函式中根據傳入的參數(來源路徑、目標路徑、操作類型等)決定是否允許操作繼續。
一個資料夾可安裝多個拷貝鉤子處理程序。Shell 會依序呼叫每個處理程序,只有所有處理程序均返回 IDYES 時,操作才會真正執行。這提供了多層防護的機制。
拷貝鉤子僅能在操作執行前進行攔截驗證,無法得知操作最終是否成功完成。若需完整監控資料夾狀態變化(如檔案實際被建立、修改、刪除),需結合 FindFirstChangeNotification 和 FindNextChangeNotification 這兩個 API 函式,它們能在操作發生後發送通知。雙管齊下,才能構建完整的資料夾監控體系。
建立一個 ActiveX Library 專案,實作兩個核心類別:
ICopyHook(含 IUnknown),核心邏輯在 CopyCallback 中。IClassFactory,負責建立 TCopyHook 實例。// TCopyHook.h 節錄
class TCopyHook: public ICopyHook {
public:
STDMETHODIMP_(UINT) CopyCallback(HWND hwnd, UINT wFunc, UINT wFlags,
LPCTSTR pszSrcFile, DWORD dwSrcAttribs,
LPCTSTR pszDestFile, DWORD dwDestAttribs);
private:
int m_refcnt;
};
// TCopyHook.cpp 核心邏輯
UINT __stdcall TCopyHook::CopyCallback(HWND hwnd, UINT wFunc, UINT wFlags,
LPCTSTR pszSrcFile, DWORD dwSrcAttribs,
LPCTSTR pszDestFile, DWORD dwDestAttribs)
{
char szMessage[MAX_PATH+14];
sprintf(szMessage, "對 %s 進行的操作,是否繼續?", pszSrcFile);
return MessageBox(NULL, szMessage, "確認", MB_YESNO | MB_ICONEXCLAMATION);
}
此範例彈出對話框詢問使用者是否允許操作,實際專案中可替換為自動化規則判斷(如白名單、黑名單、權限檢查等)。
專案需正確實作 DllGetClassObject、DllRegisterServer、DllUnregisterServer 等標準 COM 導出函式。註冊時需向 HKEY_CLASSES_ROOT\Directory\Shellex\CopyHookHandlers 新增子鍵,預設值設為元件的 CLSID(如 {7e10a039-fe03-4f9c-b7e1-c5eeeaf53735})。
Project1.dll。regsvr32.exe Project1.dll 註冊元件。ICopyHook 提供了一種輕量級、官方支援的資料夾操作攔截機制。雖然它無法事後追蹤變更,但結合檔案系統變更通知 API,即可構建功能完整的監控解決方案。本文提供的 BCB6 範例程式碼經實測可直接編譯運行,可作為二次開發的基礎框架。