[轉]如何使用MFC和類型庫建立自動化項目

來源:互聯網
上載者:User

標籤:

本文轉自:http://www.cnblogs.com/zhoug2020/archive/2012/04/01/2429064.html

 

摘要本文詳細介紹了如何自動化像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.cppDialog: 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 addition      AfxEnableControlContainer();      .      .      .} 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應用程式類型庫的名稱。   應用程式(Application)              類型庫(Type Library)   --------------------------------------------------------   Microsoft Access 97                   Msacc8.olb   Microsoft Jet Database 3.5            DAO350.dll   Microsoft Binder 97                   Msbdr8.olb   Microsoft Excel 97                    Excel8.olb   Microsoft Graph 97                    Graph8.olb   Microsoft Office 97                   Mso97.dll   Microsoft Outlook 97                  Msoutl97.olb   Microsoft PowerPoint 97               Msppt8.olb   Microsoft Word 97                     Msword8.olb   Microsoft Access 2000                 Msacc9.olb   Microsoft Jet Database 3.51           DAO360.dll   Microsoft Binder 2000                 Msbdr9.olb   Microsoft Excel 2000                  Excel9.olb   Microsoft Graph 2000                  Graph9.olb   Microsoft Office 2000                 Mso9.dll   Microsoft Outlook 2000                Msoutl9.olb   Microsoft PowerPoint 2000             Msppt9.olb   Microsoft Word 2000                   Msword9.olb   Microsoft Access 2002                 Msacc.olb   Microsoft Excel 2002                  Excel.exe   Microsoft Graph 2002                  Graph.exe   Microsoft Office 2002                 MSO.dll   Microsoft Outlook 2002                MSOutl.olb   Microsoft PowerPoint 2002             MSPpt.olb   Microsoft Word 2002                   MSWord.olb   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提示:除了 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 ==========================================================================================Excel1. 引入類#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和類型庫建立自動化項目

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.