原文位址http://blog.sina.com.cn/s/blog_557d25460100guyb.html
一
下面先說明如何在VC6.0中建立 MFC 項目。該示例使 Microsoft Excel 自動運作。您可以将前 4 個步驟用于任何項目,在使用其他應用程式時可修改其餘步驟。
建立自動化項目
- 在 VC6.0中,啟動一個名為“AutoProject”的新“MFC AppWizard (exe)”項目。
- 在 MFC AppWizard 的步驟 1 中,為應用程式類型選擇“基于對話框”,單擊“确定”建立項目。
- 打開“IDD_AUTOPROJECT_DIALOG”對話框,删除“标簽”控件 (IDC_STATIC) 和“取消”按鈕 (IDCANCEL)。将“确定”按鈕的名稱更改為“IDRUN”,并将标題更改為“運作”。關閉對話框設計窗體。
- 單擊“檢視”菜單上的“ClassWizard”(或按 Ctrl+W)。 選擇“消息映射”頁籤。在“對象 ID”清單框中選擇“IDRUN”,在“消息”清單框中選擇“BN_CLICKED”。單擊“添加函數”并接受函數名稱“OnRun”。單擊“确定”關閉 ClassWizard。
-
單擊“檢視”菜單上的“ClassWizard”(或按 Ctrl+W)。選擇“自動”頁籤。單擊“添加類”,并選擇“從類型庫”。在目錄中浏覽,為要自動運作的應用程式選擇對象庫(選擇“自動”頁籤。單擊“添加類”,并選擇“從類型庫”。在目錄中浏覽,為要自動運作的應用程式選擇對象庫(在本例中,Office 2003 中的 Excel.exe 檔案的預設位置為 C:/Program Files/Microsoft Office/Office11/Excel.exe。)在選擇了相應的對象庫後,請單擊“打開”。在“确認類”清單中選擇所有類,然後單擊“确定”,關閉“MFC ClassWizard”對話框。
“确認類”對話框中的清單框包含 Microsoft Excel 類型庫中的所有 IDispatch 接口(它們與類幾乎完全一樣)。在該對話框的下半部分,您将看到一個名為 Excel.cpp 的實作檔案,它包含由ColeDispatchDriver() 派生的已生成的類包裝,而相應的聲明頭檔案名為 Excel.h.
以下清單包含 Microsoft Office 2003 應用程式類型庫的檔案名:
Microsoft Office Access 2003 Msacc.olb
Microsoft Office Excel 2003 Excel.exe
Microsoft Graph 2003 Graph.exe
Microsoft Office 2003 MSO.dll
Microsoft Office Outlook 2003 MSOutl.olb
Microsoft Office PowerPoint 2003 MSPpt.olb
Microsoft Office Word 2003 MSWord.olb
- 将以下代碼添加到 CAutoProjectApp::InitInstance() 函數中,該函數加載并啟用 COM 服務庫:
BOOL CAutoProjectApp::InitInstance()
{
if(!AfxOleInit()) // Your addition starts here
{
AfxMessageBox("Could not initialize COM dll");
return FALSE;
} // End of your addition
AfxEnableControlContainer();
.
.
.
}
7.将#include <afxdisp.h>添加到 AutoProject.cpp 程式檔案開頭;将 #include "excel.h"
添加到 AutoProjectDlg.cpp 程式檔案開頭.
8.将自動化代碼添加到 CAutoProjectDlg::OnRun() 中:
void CAutoProjectDlg::OnRun()
{
_Application app; // app is the Excel _Application object
// Start Excel and get Application object...
if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("Couldn't start Excel.");
}
else
{
//Make Excel Visible and display a message
app.SetVisible(TRUE);
AfxMessageBox ("Excel is Running!");
}
}
9.生成并運作項目。結果:單擊對話框中的“運作”按鈕時,将啟動 Microsoft Excel。激活“Auto_Excel”對話框并關閉消息框。CAutoProjectDlg::OnRun() 函數結束時,Microsoft Excel 将退出,因為這時應用程式變量超出了作用域。雖然以上步驟闡述了如何使 Microsoft Excel 自動運作,但您還可以使用同樣的方法使其他應用程式自動運作。
二
VC操作Word2003例子
Sample Code:
_Application objWord; //定義Word應用程式對象(Word.application)
// Convenient values declared as ColeVariants.
COleVariant covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
// Get the IDispatch pointer and attach it to the objWord object.
if (!objWord.CreateDispatch("Word.Application"))
{
AfxMessageBox("Couldn't get Word object.");
return;
}
objWord.SetVisible(TRUE); //This shows the application.
Documents docs(objWord.GetDocuments());//定義Word Documents對象(Word.Documents)
_Document testDoc; //定義Word Document對象(Word.Document)
testDoc.AttachDispatch(docs.Open( //可看成VB語句set testDoc = Word.documents.Open(…)
COleVariant("C://Test.doc",VT_BSTR),
covFalse, // Confirm Conversion.
covFalse, // ReadOnly.
covFalse, // AddToRecentFiles.
covOptional, // PasswordDocument.
covOptional, // PasswordTemplate.
covFalse, // Revert.
covOptional, // WritePasswordDocument.
covOptional, // WritePasswordTemplate.
covOptional) // Format. // Last argument for Word 97
covOptional, // Encoding // New for Word 2000/2002
covTrue, // Visible
covOptional, // OpenConflictDocument
covOptional, // OpenAndRepair
(long)0, // DocumentDirection wdDocumentDirection LeftToRight
covOptional // NoEncodingDialog
) // Close Open parameters
); // Close AttachDispatch(?)
AfxMessageBox("Now printing 2 copies on the active printer");
testDoc.PrintOut(covFalse, // Background. //可看成VB語句testDoc.PrintOut(…)
covOptional, // Append.
covOptional, // Range.
covOptional, // OutputFileName.
covOptional, // From.
covOptional, // To.
covOptional, // Item.
COleVariant((long)2), // Copies.
covOptional, // Pages.
covOptional, // PageType.
covOptional, // PrintToFile.
covOptional, // Collate.
covOptional, // ActivePrinterMacGX.
covOptional // ManualDuplexPrint.
covOptional, // PrintZoomColumn New with Word 2002
covOptional, // PrintZoomRow ditto
covOptional, // PrintZoomPaperWidth ditto
covOptional); // PrintZoomPaperHeight ditto
// If you wish to Print Preview the document rather than print it,
// you can use the PrintPreview member function instead of the
// PrintOut member function:
// testDoc[i].PrintPreview.
objWord.Quit(covFalse, // SaveChanges.
covTrue, // OriginalFormat.
covFalse // RouteDocument.
);
You may need to modify the code in CAutoProjectDlg::OnRun() to indicate the correct path for your document Test.doc. The document is referenced in the following line:
testDoc.AttachDispatch(docs.Open(
COleVariant("C://My Docs//Test.doc",VT_BSTR)...
三
下面介紹在VS2005或2008中進行自動化時的注意點:
- 項目->添加類->MFC->Typelib中的MFC類,根據你的需求,添加對應的類。
- 在VS2005中添加的這些類和VC6不一樣:在工程中隻多了這幾個頭檔案.h ,沒有.cpp檔案;類名及成員函數也發生了一些變化,使用的時候可以參考VC6的函數然後再到類中找相應的函數;每個類都對應一個頭檔案。
- 按照老步驟去做最後在編譯時會出現許多錯誤,原因是MFC 類向導不能解決 Windows api 與 COM 接口方法的命名沖突,這時可以改名。
-
在所得的每個頭檔案中将
#import "C://Program Files//Microsoft Office//OFFICE11..." 删除
在stdafx.h中加入:
// mso
#import "libid:{2df8d04c-5bfa-101b-bde5-00aa0044de52}" auto_rename
// vb6ext
#import "libid:{0002e157-0000-0000-c000-000000000046}" auto_rename
// excel
#import "libid:{00020813-0000-0000-c000-000000000046}" auto_rename
//word
#import "libid:{00020905-0000-0000-C000-000000000046}" auto_rename
//ppt
#import "libid:{91493440-5A91-11CF-8700-00AA0060263B}" auto_rename
- 再編譯,不再報錯,編譯器自動生成檔案.tlh”
-
有文章介紹,作如下改動:
#import "C://Program Files//Common Files//Microsoft Shared//OFFICE11//mso.dll" /
rename("RGB", "MSRGB")
#import "C://Program Files//Common Files//Microsoft Shared//VBA/VBA6//VBE6EXT.OLB" /
raw_interfaces_only /
rename("VBE", "testVBE")
#import "C://Program Files//Microsoft Office//OFFICE11//MSWORD.OLB" /
rename_namespace("Word") raw_interfaces_only /
rename("FindText","_FindText") /
rename("Rectangle","_Rectangle") /
rename("ExitWindows","_ExitWindows"):
#import "C://Program Files//Microsoft Office//Office11//EXCEL.EXE" no_namespace /
exclude("IFont", "IPicture") /
rename("RGB", "ignorethis") /
rename("DialogBox","ignorethis") /
rename("VBE", "testVBE") /
rename("ReplaceText","EReplaceText") /
rename("CopyFile","ECopyFile") /
rename("FindText", "EFindText") /
rename("NoPrompt", "ENoPrompt")
其實單個word時尚可,同時含excel就不能通過,希望高手指出解決方法。
- 當然,我把每個頭檔案中#import ...這一行語句删除,也不會出錯。
- 由于在以前版本的 MFC 能正确識别這種情況,并在包裝類中的方法名稱前追加一個下劃線 (_)以防出錯。是以可以把VC6中生成的檔案導入到項目中(同時要包括.cpp檔案)這種方法更簡單。
- 還是用C#友善,文法簡潔。
- 另請參考文章:http://support.microsoft.com/kb/316587/