加载中…
个人资料
春山飞雪
春山飞雪
  • 博客等级:
  • 博客积分:0
  • 博客访问:420,311
  • 关注人气:352
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

使用VC创建Office 应用程序自动化项目

(2010-01-28 00:00:00)
标签:

vc

mfc

microsoft

office

automation

it

分类: C/C /C#编程

   下面先说明如何在VC6.0中创建 MFC 项目。该示例使 Microsoft Excel 自动运行。您可以将前 4 个步骤用于任何项目,在使用其他应用程序时可修改其余步骤。

创建自动化项目

  1. 在 VC6.0中,启动一个名为“AutoProject”的新“MFC AppWizard (exe)”项目。
  2. 在 MFC AppWizard 的步骤 1 中,为应用程序类型选择“基于对话框”,单击“确定”创建项目。
  3. 打开“IDD_AUTOPROJECT_DIALOG”对话框,删除“标签”控件 (IDC_STATIC) 和“取消”按钮 (IDCANCEL)。将“确定”按钮的名称更改为“IDRUN”,并将标题更改为“运行”。关闭对话框设计窗体。
  4. 单击“查看”菜单上的“ClassWizard”(或按 Ctrl+W)。 选择“消息映射”选项卡。在“对象 ID”列表框中选择“IDRUN”,在“消息”列表框中选择“BN_CLICKED”。单击“添加函数”并接受函数名称“OnRun”。单击“确定”关闭 ClassWizard。
  5. 单击“查看”菜单上的“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

     

  6. 将以下代码添加到 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/

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有