在 Windows 環境下,無論使用 Visual C++、Delphi 等工具,應用程式常需整合系統內建功能(檔案複製、刪除、尋找、執行程式等)。直接呼叫作業系統提供的 Shell 介面,不僅減少程式體積與開發工時,更因由系統核心處理,大幅降低錯誤率。微軟已在發布前完成核心功能測試,開發者可專注於業務邏輯除錯。
傳統方式需操作龐大結構體(如 SHFILEOPSTRUCT),欄位多達十幾至幾十個,設定繁瑣。以檔案複製為例:
SHFILEOPSTRUCT FileOp;
FileOp.hwnd = m_hWnd;
FileOp.wFunc = FO_COPY;
FileOp.pFrom = m_source;
FileOp.pTo = m_detect;
FileOp.fFlags = FOF_ALLOWUNDO;
FileOp.hNameMappings = NULL;
FileOp.lpszProgressTitle = strTitle;
SHFileOperation(&FileOp);
if (FileOp.fAnyOperationsAborted) TRACE("Operation aborted!");
更複雜的系統托盤、工作列程式設計更是困難重重,MFC 未提供封裝類別,僅能呼叫 WinAPI,彷彿回到 SDK 程式設計時代。
COM 將物件完美封裝,客戶端僅透過介面存取。Windows 本身即大型 COM 物件,提供 IShellDispatch 等介面。開發步驟:
CoInitialize(NULL)(MFC 專案可用 AfxOleInit())IShellDispatch *pShellDisp = NULL;
HRESULT sc = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_SERVER,
IID_IDispatch, (LPVOID*)&pShellDisp);
if (FAILED(sc)) return;
pShellDisp->FindFiles();pShellDisp->Release();| 方法 | 功能 |
|---|---|
| MinimizeAll | 所有視窗最小化 |
| UndoMinimizeALL | 還原最小化視窗 |
| FileRun | 「執行」對話方塊 |
| CascadeWindows | 疊層視窗 |
| TileVertically | 垂直平鋪 |
| TileHorizontally | 水平平鋪 |
| ShutdownWindows | 關閉 Windows |
| Suspend | 待機/休眠 |
| SetTime | 設定時間 |
| TrayProperties | 工作列屬性 |
| Help | Windows 說明 |
| FindFiles | 尋找檔案 |
| FindComputer | 尋找電腦 |
所有介面定義於 VC 安裝目錄 VC98\Include\Exdisp.h。
本文展示以 COM 介面取代傳統結構體操作的 Shell 程式設計範例。掌握此設計思維後,不僅能操作 Windows Shell,同樣適用於 Office、IE 等支援 COM 的應用程式整合。核心在於理解「介面即契約」的程式設計範式,而非死記程式碼細節。