自動化建立在 COM/DCOM 之上,允許一個應用程式(客戶端)操控另一個應用程式(伺服器端)公開的物件、方法與屬性。Microsoft Office 套件皆為典型自動化伺服器。依部署位置分為:
核心介面為 IDispatch,提供晚期繫結能力,支援多種語言(含無指標語言如 VB)。ActiveX 控制項本質上是進程內的小型自動化伺服器(.OCX),除屬性/方法外還支援事件。
自動化跨語言傳遞資料需統一格式,VARIANT 結構包含「型別標籤」與「資料值」兩部分。MFC 提供封裝類別:
COleVariant:封裝 VARIANT,通用於所有變體參數COleDateTime、COleCurrency:專門處理日期/貨幣CEditViewDocuments、Selection 等)msword9.olb(通常在 Office 安裝目錄),選擇 _Application、_Documents、Selection 產生對應 C++ 類別StdAfx.h 加入 #include <afxdisp.h>InitInstance 初始化 COM:CoInitialize(NULL)void CMyView::OnAutoDisplayWord() {
// 1. 選擇 Word 文件
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("Word Files (*.doc)|*.doc||"));
if (dlg.DoModal() != IDOK) return;
CString strPath = dlg.GetPathName();
// 2. 建立 Word Application 物件
_Application app;
if (!app.CreateDispatch(_T("Word.Application"))) {
AfxMessageBox(_T("無法啟動 Word"));
return;
}
app.put_Visible(TRUE); // 可見模式方便除錯
// 3. 取得 Documents 集合並開啟文件
Documents docs;
docs.AttachDispatch(app.GetDocuments());
COleVariant varFile(strPath), varFalse((short)0), varTrue((short)1), varNull;
docs.Open(varFile, varFalse, varFalse, varFalse, varNull, varNull,
varFalse, varNull, varNull, varTrue, varTrue, varTrue);
// 4. 取得 Selection 物件,全選並複製
Selection sel;
sel.AttachDispatch(app.GetSelection());
sel.WholeStory();
sel.Copy();
// 5. 貼上至 CEditView
GetEditCtrl().Paste();
// 6. 清理
docs.ReleaseDispatch();
sel.ReleaseDispatch();
app.Quit(); // 或視需求保持開啟
}
COleDispatchDriver::CreateDispatch:建立伺服器物件並取得 IDispatchAttachDispatch:將 MFC 包裝類別與介面指標關聯ReleaseDispatch:釋放關聯,避免資源洩漏COleVariant 包裝,對應 VBA 的 Variant掌握此模式後,可輕鬆擴充至 Excel(Workbook、Worksheet、Range)、PowerPoint(Presentation、Slide)等 Office 組件,實現報表自動產生、圖表匯出、簡報建立等企業級自動化需求。