如何使用MFC和类型库创建自动化项目
摘要
本文詳細介紹了如何自動化像Microsoft Office這樣支持COM的應用程序。
更多信息
下面部分介紹了如何創建MFC項目。采用Microsoft Excel舉例,你可以將前8個步驟用于任何項目,修改9-15步用于不同的應用程序。
創建自動化項目
| 1. | 在Microsoft Developer Studio中,創建"MFC AppWizard(exe)"項目,命名為"AutoProject." |
| 2. | 在第1步的MFC應用程序向導中,選擇"Dialog Based"應用程序類型并點"完成" 在創建的項目信息對話框中將顯示創建的類: Application: CAutoProjectApp in AutoProject.h and AutoProject.cpp Dialog: CAutoProjectDlg in AutoProject.h and AutoProjectDlg.cpp 點 OK 完成項目創建。 |
| 3. | Visual Studio設計編輯區打開了對話框"IDD_AUTOPROJECT_DIALOG" ,依照下面兩步修改它。 |
| 4. | 刪除靜態控件(IDC_STATIC)和Cancel按鈕(IDCANCEL) |
| 5. | 將OK按鈕改為"IDRUN",說明改為"Run." 關閉AutoProject.rc對話框設計界面。 |
| 6. | 點View菜單中的ClassWizard(或按CTRL+W) |
| 7. | 選擇消息映射(Message Maps)標簽,在對象ID列表框中選擇IDRUN,在消息列表框中選擇"BN_CLICKED",點添加函數并命名為"OnRun",點OK關閉ClassWizard 提示:此步驟在AutoProjectDLG.h中定義了"OnRun();"函數,并在 AutoProjectDLG.cpp 中添加了消息處理函數CAutoProjectDlg::OnRun()。 |
| 8. | 點View菜單中的ClassWizard(或按CTRL+W) |
| 9. | 選擇Automation標簽,點Add Class并選擇"From a type library" 瀏覽并選擇你希望自動化的對象庫(例如,如果你自動化Excel 97, 則選擇Microsoft Excel 8.0 對象庫,默認位于 C:\Program Files\Microsoft Office\Office\Excel8.olb). 如果你自動化Microsoft Excel 2000,選擇位于 C:\Program Files\Microsoft Office\Office\Excel9.olb 的Microsoft Excel 9.0 對象庫。 如果你自動化Microsoft Excel 2002和Microsoft Office Excel 2003 ,對象庫內含在Excel.exe中,Office 2002的Excel.exe 默認位于 C:\program Files\Microsoft Office\Office10\Excel.exe, Office 2003的Excel.exe 默認位于 C:\program Files\Microsoft Office\Office11\Excel.exe 。選擇合適的對象庫后,點Open,在類確認列表中選擇所有類,點OK。 提示:類確認對話框中的列表框里包含了Microsoft Excel 類型庫中的所有IDispatch接口(與類中一致)。在對話框下面可以看到命名為Excel8.cpp的執行文件,該文件包含了從COleDispatchDriver派生的封裝類,頭文件是Excel8.h(對于Excel 2002和Excel 2003,文件名為Excel.cpp和Excel.h) |
| 10. | 點OK關閉MFC ClassWizard對話框 |
| 11. | 在 CAutoProjectApp::InitInstance() 函數中添加如下代碼,用于加載COM支持庫: BOOL CAutoProjectApp::InitInstance() {if(!AfxOleInit()) // Your addition starts here{AfxMessageBox("Could not initialize COM dll");return FALSE;} // End of your additionAfxEnableControlContainer();...} |
| 12. | 在AutoProject.cpp頂部添加#include行 #include <afxdisp.h> |
| 13. | 在AutoProjectDlg.cpp 頂部stdafx.h下添加對excel8.h的包含 #include "stdafx.h" #include "excel8.h" // excel.h in the case of Excel 2002 and Excel 2003. |
| 14. | 在CAutoProjectDlg::OnRun()中添加如下所示的自動化代碼 void CAutoProjectDlg::OnRun() {_Application app; // app 是 Excel _Application 對象// 啟動 Excel 并得到應用程序對象if(!app.CreateDispatch("Excel.Application")){AfxMessageBox("Couldn''t start Excel.");}else{//使 Excel 可視,然后顯示消息app.SetVisible(TRUE);AfxMessageBox ("Excel is Running!");} } |
| 15. | 編譯并運行項目。運行結果:當你點擊對話框中的Run按鈕,Microsoft Excel將被調用。關閉消息框使Auto_Excel對話框激活。CAutoProjectDlg::OnRun()函數結束,application變量離開作用域,Microsoft Excel將退出。 |
附加說明
當你在項目中從類型庫添加類(根據上面所說的9個步驟),你將注意到在項目中添加了許多類。在ClassView中你可以雙擊某個類查看該類在Excel8.cpp中的定義。
如果你需要驗證返回值或改變函數的執行,你需要得到函數的定義,無論何時當你改變函數定義,記住在Excel8.h中修改定義。當你這樣做的時候,請確認你改變的是正確的函數定義;有時多個類中包含了相同名字的函數,例如GetApplication。
通過以上如何自動化Microsoft Excel的講述,你可以將這些方法應用到其它自動化程序中。下表包含了Microsoft Office應用程序類型庫的名稱。
提示:除了 Dao350.dll 、Dao360.dll和 Microsoft Office 10(MSO.dll),類型庫默認位于: C:\Program Files\Microsoft Office\Office (Office 2002 路徑是 C:\...\Office10,Office 2003 路徑是 C:\...\Office11), Dao350.dll/Dao360.dll 默認位于 C:\Program Files\Common Files\Microsoft Shared\Dao。 Office 2002 的MSO.dll 默認 C:\Program Files\Common Files\Microsoft Shared\Office10, Office 2003 的MSO.dll位于 C:\Program Files\Common Files\Microsoft Shared\Office11
==========================================================================================
Excel
1. 引入類
#include "CApplication.h"
#include "CFont0.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CRange.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
2. 主要接口
BOOL CXXX::Create(void)
{
??? if(!m_app.CreateDispatch(L"Excel.Application"))
?? {
?????? AfxMessageBox(L"Could not start Excel.");
????? return FALSE;
?? }
?? m_app.put_DisplayAlerts (VARIANT_FALSE);
?? m_app.put_UserControl(FALSE);
?? return TRUE;
}
void CXXX::Destroy(void)
{
???? //CloseWorkbook();
???? m_app.Quit();
???? m_app.ReleaseDispatch();
}
int CXXX::OpenWorkbook(CString strPath)
{
??? try
??? {
???????? LPDISPATCH lpDisp;
???????? lpDisp = m_app.get_Workbooks();? // Get an IDispatch pointer
???????? ASSERT(lpDisp);
???????? m_books.AttachDispatch( lpDisp );? // Attach the IDispatch pointer to the books object.
???????? // open the document
???????? lpDisp = m_books.Open(strPath,???? m_covOptional, m_covOptional,
????????? m_covOptional, m_covOptional, m_covOptional, m_covOptional,
????????? m_covOptional, m_covOptional, m_covOptional, m_covOptional,
????????? m_covOptional, m_covOptional, m_covOptional, m_covOptional);
???????? ASSERT(lpDisp);
???????? //Set CWorkbook to use lpDisp, the IDispatch* of the actual workbook.
?????? ? m_book.AttachDispatch(lpDisp);?
???????? m_sheets = m_book.get_Worksheets();
??? }
??? catch(COleDispatchException* e)
??? {
??????? TRACE(_T("[EXCEPTION]OpenWorkbook exception COleDispatchException!!!\n"));
??????? TCHAR msg[2048];
??????? e->GetErrorMessage(msg,1024);
??????? e->Delete();
??????? MessageBox(0,msg, TEXT("Error"), MB_OK | MB_ICONERROR);
??????? return -1;
???? }
???? return 0;
}
?void Cxxxx::CloseWorkbook(void)
{
????m_sheet.ReleaseDispatch();
m_sheets.ReleaseDispatch();
m_book.ReleaseDispatch();
m_books.Close();
m_books.ReleaseDispatch();
}
int CXXX::ReaddExcelData(CString strPath)
{
if( -1 == OpenWorkbook(strPath) )
{
CloseWorkbook();
return -1;
}
if ( !ParseCauSheet() )
{
CloseWorkbook();
return -1;
}
CloseWorkbook();
return 0;
}
void CExcelOp::ParseSheet(void)
{
????CRange range;
CRange usedRange;
COleVariant val;
CString strRangeId,strKeyword;
CString strRangePos;
int index = 0;
m_sheet = m_sheets.get_Item(COleVariant((short)(1))); // m_sheets are indexed starting from 1
usedRange = m_sheet.get_UsedRange();
range = usedRange.get_Rows();
int nRowCnt = (int)range.get_Count();
for(int i = 1; i <= nRowCnt; i++)
{
。。。。。
}
return;
}
總結
以上是生活随笔為你收集整理的如何使用MFC和类型库创建自动化项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【设计模式系列】OO设计原则之LSP-L
- 下一篇: ProtoBuf 简单测试