My FAQ,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 其他处理
在VC中调用WORD(显示,修改,存盘,运行宏)
作者:ZHENG017 时间:2001-10-15 10:19 出处:互联网 责编:MyFAQ
              摘要:在VC中调用WORD(显示,修改,存盘,运行宏)

(1)使用AppWizard创建一个新的MFC AppWizard(EXE)工程,命名为"office" 
(2)选择单文档视图(SDI)结构,在第3步中需要选中Container,以提供容器支持,并且选中active document container 其它都为默认

(3)在View菜单中,选ClassWizard,选Automation选项卡,选Add Class,选择From a TypeLibrary, 在Office目录中选中Microsoft Word 97/2000 类型库Word8.olb或Word9.olb,选中application,document,_document。单击ok

(4)给COfficeCntrItem添加一方法。GetIDispatch()

其源码如下:

  ASSERT_VALID(this);  
 ASSERT(m_lpObject != NULL);   
 LPUNKNOWN lpUnk = m_lpObject;   
 Run();   
 LPOLELINK lpOleLink = NULL;  
 if (m_lpObject->QueryInterface(IID_IOleLink, (LPVOID FAR*)&lpOleLink) == NOERROR)   
 {   
  ASSERT(lpOleLink != NULL);   
  lpUnk = NULL;       
  if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)    
  {    
   TRACE0("Warning: Link is not connected!\n");    
   lpOleLink->Release();    
   return NULL;    
  }   
  ASSERT(lpUnk != NULL);   
 }    
 LPDISPATCH lpDispatch = NULL;  
 if (lpUnk->QueryInterface(IID_IDispatch, (LPVOID FAR*)&lpDispatch)!=NOERROR)   
 {
    TRACE0("Warning: does not support IDispatch!\n");   
  return NULL;
  
 }
 ASSERT(lpDispatch != NULL);  
 return lpDispatch;
(5)。在officeView.h添加#include "msword8.h"

(6)。修改void COfficeView::OnInsertObject(),源码如下:

 BeginWaitCursor();

 COfficeCntrItem* pItem = NULL;
 TRY
 {
  // Create new item connected to this document.
  COfficeDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  pItem = new COfficeCntrItem(pDoc);
  ASSERT_VALID(pItem);

  // Initialize the item from the dialog data.
 /* if (!dlg.CreateItem(pItem))
   AfxThrowMemoryException();  // any exception will do
  ASSERT_VALID(pItem);*/
   CLSID clsid; //
  if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)))
   AfxThrowMemoryException();
  
  if(!pItem->CreateNewItem(clsid)) 
  /*if(!pItem->CreateFromFile (filename,clsid)) */
   AfxThrowMemoryException();
  ASSERT_VALID(pItem);
  
  pItem->Activate (OLEIVERB_SHOW,this);
  
 

  ASSERT_VALID(pItem);
         m_pSelection = pItem;   // set selection to last inserted item
  pDoc->UpdateAllViews(NULL);
  // As an arbitrary user interface design, this sets the selection
  //  to the last item inserted.

  // TODO: reimplement selection as appropriate for your application

  m_pSelection = pItem;   // set selection to last inserted item
  pDoc->UpdateAllViews(NULL);
 }
 CATCH(CException, e)
 {
  if (pItem != NULL)
  {
   ASSERT_VALID(pItem);
   pItem->Delete();
  }
  AfxMessageBox(IDP_FAILED_TO_CREATE);
 }
 END_CATCH

 EndWaitCursor();

(7)重载ID—FILE—SAVE,

void COfficeView::OnFileSave()
{
 // TODO: Add your command handler code here
  TRY{
     LPDISPATCH lpDisp;
  
  lpDisp = m_pSelection->GetIDispatch();

    Documents docs;
  
  _Application app;
  
  _Document mydoc;
  Documents my;

  mydoc.AttachDispatch (lpDisp,TRUE);
  app=mydoc.GetApplication ();
    /*   app.Run ("Macro3");*/
     mydoc.Activate ();
  BOOL password=mydoc.GetHasPassword ();
  mydoc.SetPassword ("love");
  password=mydoc.GetHasPassword ();  
  COleVariant vFalse((short)FALSE);
  mydoc.SaveAs (COleVariant("c:\\love.doc"),vFalse,vFalse, COleVariant(""),vFalse,
   COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);
  
 }
 CATCH(CException, e)
 {
        }
 END_CATCH
}

bulid,click insert object,and edit ,and save.maybe run macro.

自己辛苦了很久加上别人的经验总算做出来。:)

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有