一概述
我們在編寫程序開發軟件的過程中如果能利用已有的程序的功能那麼可以大大減輕開發過程中程序員的工作量同時達到事半功倍的效果例如在工程中許多軟件需要文字處理功能雖然MFC提供了一些方法但是具體實現起來既費事又有一定的困難如果我們可以直接使用OFFICE提供的功能豈不美哉!要實現這一目的只需要利用ActiveX Automation 技術就可以輕松實現本文主要講述了自動化的概念並通過一個操作Word文檔的例子來幫助讀者理解VC編程中如何實現自動化
二自動化
.自動化的概念
在Windows程序開發中自動化是基於COM/DCOM之上的技術它可以使一個應用程序來操縱另外一個程序中的對象使用該程序提供的豐富的功能或者是一個應用程序通過提供一些對象及對象的方法和屬性來允許另外一個程序使用它提供的各種功能其中根據程序是受惠者還是施惠者這一原則將提供對象和對象屬性方法的應用程序稱為自動化服務器端使用對象屬性方法的應用程序叫作自動化的客戶端自動化服務器讓其它程序告訴它做些什麼它揭示的函數和數據稱為方法(Methods)和屬性(Properties)例如Microsoft Office套件中的成員WordExcel等都是自動化服務器根據自動化的客戶端和服務器端的不同位置又可以將自動化分為兩類
)如果作為服務器端和客戶端的兩個不同的應用程序都在同一台計算機上叫作本地自動化
)如果作為服務器端和客戶端的兩個不同的應用程序是基於網絡的分別處於不同的計算機上叫作遠程自動化
需要讀者注意的是由於利用了COM技術客戶端無法直接獲得服務器端的對象來實現對它的訪問它必須通過獲取一個指向接口的指針來使用對象提供的功能這個接口稱為IDispatch它是一個簡化的使用多種不同語言的特殊接口(包括象VB這樣不能使用指針的語言)這部分內容讀者可以在下面的程序實現過程中細細體味
說到自動化不能不提一下ActiveX控件它其實是在進程中裝入的極小自動化服務器這意味著它們的執行速度極快它們原來被稱為OLE自定義控件用來替代VB和VC中使用的位的VBX控件由於ActiveX控件通常被保存為OCX文件所以又稱它為OCX控件因為控件是一個小型化的自動化服務器它們需要在自動化客戶端使用我們又將這時的客戶端應用程序稱為容器應用程序ActiveX控件除了屬性和方法外還包含事件(events)當一些事情需要容器應用程序注意時控件才會觸發一個事件如用戶的單擊等
.自動化中的數據類型
在實現自動化編程中最重要的一個問題是程序員要明白在自動化的客戶端和服務器端數據是如何傳遞的如何提供一個統一安全的機制來實現數據傳遞呢?在VC開發平台上它提供了一個叫VARIANT的數據類型來解決這個問題該數據類型有兩部分組成第一部分為數據的類型第二部分才是具體的數據的數值在VARIANT數據類型的基礎上VC提供了ColeVariant類它對VARIANT數據類型進行了封裝這意味著在所有使用VARIANT的地方都可以使用ColeVariant類的對象在操作日期和貨幣變量時VC又提供了兩個類ColeCurrency和ColeDateTime具體的內容讀者可以參考MSDN 三操作Word的例子
本文的例子演示了如何操作Word實現自動化這個例子主要是為了輔助解釋說明Visual C++編程中怎樣實現自動化幫助讀者對自動化的實現過程有一個感性的認識所以為了簡單起見該程序的功能是僅僅選擇一個Word的*Doc文檔並將它的內容都在該程序的視中顯示出來為了達到這個目的就需要啟動Word打開用戶所選擇的文件進行全選和剪貼板操作然後將數據粘貼到視中
在這個例子的具體實現中我們的應用程序為自動化的客戶端Word為自動化的服務器端首先生成一個新的單文檔應用程序給該項目起個名字為kk視的基類選擇CEditView由於Office中的許多操作是由VBA語言來實現的所以我們在使用自動化操作Word的過程中為了清楚Word的工作過程我們要對VBA有所了解這些知識可以通過在Word中錄制宏來實現錄制宏的步驟如下啟動Word選擇工具菜單下的錄制宏子菜單為一個新的宏起個名字為Macro開始錄制宏這時候窗口出現一個浮動工具條點擊上面的按鈕可以停止或暫停宏的錄制下面是實現打開一個Word文檔全部選擇文檔內容並將數據存放到剪貼板上的操作的宏代碼
@# Sub Macro()
@#@# 宏在 由 LiuTao 錄制
@#
DocumentsOpen FileName:=基於Visual Cdoc ConfirmConversions:=False _
ReadOnly:=False AddToRecentFiles:=False PasswordDocument:= _
PasswordTemplate:= Revert:=False WritePasswordDocument:= _
WritePasswordTemplate:= Format:=wdOpenFormatAuto
SelectionWholeStory
SelectionCopy
End Sub
查看宏代碼可以點擊Word
中工具菜單下的Visual Basic 編輯器
從上面的代碼中可以看出對Word
的這幾個操作用到了Documents
Selection這兩個自動化服務器端顯示出來的對象和它們的方法
為了操作Word
需要使用它的類型庫
這可以在Msword
olb文件中找到
這個文件通常情況下位於Microsoft Office的安裝目錄下面
利用Visual C++中的ClassWizard可以方便的向應用程序添加新的類型庫
在程序中啟動ClassWizard
選擇Add class…
\From a type library …\C:\OFFICE\msword
olb
在彈出的對話框中選擇_Application
_Documents
Selection
這樣就可以為客戶端程序程序中使用到的每個Word
對象建立相應的C++類
這些類的定義和實現分別在msword
h和msword
cpp文件中給出
為了使我們生成的項目支持自動化
為此我們要在項目中的StdAfx
h的文件末尾添加上下面一行
#include
afxdisp
h
在應用程序的InitInstance函數的開始添加下面的調用
if (CoInitialize(NULL)!=
)
{
AfxMessageBox(
初始化COM支持庫失敗!
);
exit(
);
}
首先通過COleDispatchDriver的成員函數CreateDispatch()創建一個Word
的Applicaion對象
然後通過COleDispatchDriver的成員函數AttachDispatch()將Documents和Selection對象與Application對象提供的IDispatch接口關聯起來
在程序對上述對象使用完畢後
要使用COleDispatchDriver的成員函數ReleaseDispatch()來釋放對象和接口之間的連接
有了上面的准備工作
下面給出如何實現上述操作目標的具體代碼
該程序在Windows Me環境下
Visual C++
開發平台上編譯通過
運行正常
void CKkView::OnMenuAutoDisplay()
{
// TODO: Add your command handler code here
static char BASED_CODE szFilter[]=
Word Files(*doc)|*
DOC||
;
CFileDialog fd(true
NULL
NULL
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT
szFilter
NULL);
CString strFilePath;//用來保存打開的文件名
if(fd
DoModal()==IDOK)
strFilePath=fd
GetPathName();//獲取要打開的Word文檔的名字
_Application m_App;//定義Word提供的應用程序對象
Documents m_Docs;//定義Word提供的文檔對象
Selection m_Sel;//定義Word提供的選擇對象
m_Docs
ReleaseDispatch();
m_Sel
ReleaseDispatch();
m_App
m_bAutoRelease=true;
if(!m_App
CreateDispatch(
Word
Application
))
{
AfxMessageBox(
創建Word
服務失敗!
);
exit(
);
}
//下面是定義VARIANT變量
COleVariant varFilePath(strFilePath);
COleVariant varstrNull(
);
COleVariant varZero((short)
);
COleVariant varTrue(short(
)
VT_BOOL);
COleVariant varFalse(short(
)
VT_BOOL);
m_Docs
AttachDispatch(m_App
GetDocuments());//將Documents類對象m_Docs和Idispatch接口關聯起來
m_Docs
Open(varFilePath
varFalse
varFalse
varFalse
varstrNull
varstrNull
varFalse
varstrNull
varstrNull
varTrue
varTrue
varTrue);
//打開Word文檔
m_Sel
AttachDispatch(m_App
GetSelection());//將Selection類對象m_Sel和Idispatch接口關聯起來
m_Sel
WholeStory ();//選擇文檔中的全部內容
m_Sel
Copy();//將數據拷貝到剪貼板
this
>GetEditCtrl( )
Paste ();//將數據粘貼到程序的
視
中
m_Docs
ReleaseDispatch();//斷開關聯
m_Sel
ReleaseDispatch();
}
本文主要講述了基於自動化技術來操作Word
實現自動化的客戶端的實現思想
為讀者起到拋磚引玉的作用
讀者可以在此基礎上
實現對Word
Excel
PowerPoint等服務器端進行更復雜的操作
From:http://tw.wingwit.com/Article/program/net/201311/13458.html