如何使用MFC和类型库创建自动化项目
摘要
本文詳細(xì)介紹了如何自動(dòng)化像Microsoft Office這樣支持COM的應(yīng)用程序。
更多信息
下面部分介紹了如何創(chuàng)建MFC項(xiàng)目。采用Microsoft Excel舉例,你可以將前8個(gè)步驟用于任何項(xiàng)目,修改9-15步用于不同的應(yīng)用程序。
創(chuàng)建自動(dòng)化項(xiàng)目
| 1. | 在Microsoft Developer Studio中,創(chuàng)建"MFC AppWizard(exe)"項(xiàng)目,命名為"AutoProject." |
| 2. | 在第1步的MFC應(yīng)用程序向?qū)е?#xff0c;選擇"Dialog Based"應(yīng)用程序類型并點(diǎn)"完成" 在創(chuàng)建的項(xiàng)目信息對(duì)話框中將顯示創(chuàng)建的類: Application: CAutoProjectApp in AutoProject.h and AutoProject.cpp Dialog: CAutoProjectDlg in AutoProject.h and AutoProjectDlg.cpp 點(diǎn) OK 完成項(xiàng)目創(chuàng)建。 |
| 3. | Visual Studio設(shè)計(jì)編輯區(qū)打開(kāi)了對(duì)話框"IDD_AUTOPROJECT_DIALOG" ,依照下面兩步修改它。 |
| 4. | 刪除靜態(tài)控件(IDC_STATIC)和Cancel按鈕(IDCANCEL) |
| 5. | 將OK按鈕改為"IDRUN",說(shuō)明改為"Run." 關(guān)閉AutoProject.rc對(duì)話框設(shè)計(jì)界面。 |
| 6. | 點(diǎn)View菜單中的ClassWizard(或按CTRL+W) |
| 7. | 選擇消息映射(Message Maps)標(biāo)簽,在對(duì)象ID列表框中選擇IDRUN,在消息列表框中選擇"BN_CLICKED",點(diǎn)添加函數(shù)并命名為"OnRun",點(diǎn)OK關(guān)閉ClassWizard 提示:此步驟在AutoProjectDLG.h中定義了"OnRun();"函數(shù),并在 AutoProjectDLG.cpp 中添加了消息處理函數(shù)CAutoProjectDlg::OnRun()。 |
| 8. | 點(diǎn)View菜單中的ClassWizard(或按CTRL+W) |
| 9. | 選擇Automation標(biāo)簽,點(diǎn)Add Class并選擇"From a type library" 瀏覽并選擇你希望自動(dòng)化的對(duì)象庫(kù)(例如,如果你自動(dòng)化Excel 97, 則選擇Microsoft Excel 8.0 對(duì)象庫(kù),默認(rèn)位于 C:\Program Files\Microsoft Office\Office\Excel8.olb). 如果你自動(dòng)化Microsoft Excel 2000,選擇位于 C:\Program Files\Microsoft Office\Office\Excel9.olb 的Microsoft Excel 9.0 對(duì)象庫(kù)。 如果你自動(dòng)化Microsoft Excel 2002和Microsoft Office Excel 2003 ,對(duì)象庫(kù)內(nèi)含在Excel.exe中,Office 2002的Excel.exe 默認(rèn)位于 C:\program Files\Microsoft Office\Office10\Excel.exe, Office 2003的Excel.exe 默認(rèn)位于 C:\program Files\Microsoft Office\Office11\Excel.exe 。選擇合適的對(duì)象庫(kù)后,點(diǎn)Open,在類確認(rèn)列表中選擇所有類,點(diǎn)OK。 提示:類確認(rèn)對(duì)話框中的列表框里包含了Microsoft Excel 類型庫(kù)中的所有IDispatch接口(與類中一致)。在對(duì)話框下面可以看到命名為Excel8.cpp的執(zhí)行文件,該文件包含了從COleDispatchDriver派生的封裝類,頭文件是Excel8.h(對(duì)于Excel 2002和Excel 2003,文件名為Excel.cpp和Excel.h) |
| 10. | 點(diǎn)OK關(guān)閉MFC ClassWizard對(duì)話框 |
| 11. | 在 CAutoProjectApp::InitInstance() 函數(shù)中添加如下代碼,用于加載COM支持庫(kù): 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下添加對(duì)excel8.h的包含 #include "stdafx.h" #include "excel8.h" // excel.h in the case of Excel 2002 and Excel 2003. |
| 14. | 在CAutoProjectDlg::OnRun()中添加如下所示的自動(dòng)化代碼 void CAutoProjectDlg::OnRun() {_Application app; // app 是 Excel _Application 對(duì)象// 啟動(dòng) Excel 并得到應(yīng)用程序?qū)ο骾f(!app.CreateDispatch("Excel.Application")){AfxMessageBox("Couldn''t start Excel.");}else{//使 Excel 可視,然后顯示消息app.SetVisible(TRUE);AfxMessageBox ("Excel is Running!");} } |
| 15. | 編譯并運(yùn)行項(xiàng)目。運(yùn)行結(jié)果:當(dāng)你點(diǎn)擊對(duì)話框中的Run按鈕,Microsoft Excel將被調(diào)用。關(guān)閉消息框使Auto_Excel對(duì)話框激活。CAutoProjectDlg::OnRun()函數(shù)結(jié)束,application變量離開(kāi)作用域,Microsoft Excel將退出。 |
附加說(shuō)明
當(dāng)你在項(xiàng)目中從類型庫(kù)添加類(根據(jù)上面所說(shuō)的9個(gè)步驟),你將注意到在項(xiàng)目中添加了許多類。在ClassView中你可以雙擊某個(gè)類查看該類在Excel8.cpp中的定義。
如果你需要驗(yàn)證返回值或改變函數(shù)的執(zhí)行,你需要得到函數(shù)的定義,無(wú)論何時(shí)當(dāng)你改變函數(shù)定義,記住在Excel8.h中修改定義。當(dāng)你這樣做的時(shí)候,請(qǐng)確認(rèn)你改變的是正確的函數(shù)定義;有時(shí)多個(gè)類中包含了相同名字的函數(shù),例如GetApplication。
通過(guò)以上如何自動(dòng)化Microsoft Excel的講述,你可以將這些方法應(yīng)用到其它自動(dòng)化程序中。下表包含了Microsoft Office應(yīng)用程序類型庫(kù)的名稱。
提示:除了 Dao350.dll 、Dao360.dll和 Microsoft Office 10(MSO.dll),類型庫(kù)默認(rèn)位于: C:\Program Files\Microsoft Office\Office (Office 2002 路徑是 C:\...\Office10,Office 2003 路徑是 C:\...\Office11), Dao350.dll/Dao360.dll 默認(rèn)位于 C:\Program Files\Common Files\Microsoft Shared\Dao。 Office 2002 的MSO.dll 默認(rèn) 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;
}
總結(jié)
以上是生活随笔為你收集整理的如何使用MFC和类型库创建自动化项目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【设计模式系列】OO设计原则之LSP-L
- 下一篇: ProtoBuf 简单测试