请问各位高手,谁知道如何通过vc访问office环境下的宏,包括读取和修改功能,不知道您有实用的源程序么,能否发给我一份?多谢了,

解决方案 »

  1.   

    http://159.226.75.62/wwwboard.tech/messages/178.htmlvc调用word--------------------------------------------------------------------------------[ 跟贴 ] [ 加跟贴 ] [ 回留言板首页 ] [ FAQ ]--------------------------------------------------------------------------------Posted by wasp (256.256.256.256) on March 22, 2002 at 15:19:29: 发信人: inside (inside study++), 信区: VC
    标 题: 在vc中调用word
    发信站: 南京大学小百合站 (Sun Sep 16 08:37:50 2001), 站内信件 
    转自csdn ZHENG017 (1)使用AppWizard创建一个新的MFC AppWizard(EXE)工程,命名为"office"
    (2)选择单文档视图(SDI)结构,在第3步中需要选中Container,以提供容器支持,并且
    选中active document container 其它都为默认
    (3)在View菜单中,选ClassWizard,选Automation选项卡,选Add Class,选择From a T
    ypeLibrary, 在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) == NO
    ERROR)
    {
    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(""),v
    False,
    COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);
    }
    CATCH(CException, e)
    {
    }
    END_CATCH
    }
    bulid,click insert object,and edit ,and save.maybe run macro.
    自己辛苦了很久加上别人的经验总算做出来。:) 
      

  2.   

    你看到了:
    app.Run ("Macro3");
      

  3.   

    app.Run ("Macro3");是指运行名称为"Macro3"的宏么,其机制是怎样的?望请指教
      

  4.   

    你可以参考Office的帮助关于VBA编程的.比较全.