当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>Visual C++教程

使用VC++获得Microsoft Word97应用事件

    这文章证明怎样使用VC++.获得微软word97应用事件。但是,在这文章中观念和代码是并非对Microsoft Word特有。 他们是适用于整个套微软office应用, 以及任何其它类似的应用程序。

    更多信息

    下列的步给怎样建立MFC应用,它可以捕获Microsoft Word 97 Application事件Startup(), DocumentChange()和Quit():

    使用MFC AppWizard创造一个新对话框。给出项目的名字WordEvents, 接受缺省的设置.给你的对话框添加两按键,并分别命名为"Start and Setup"和"Quit and Clean Up"。

    添加下列的代码到 "Start and Setup"按键的句柄:

    // 检查看是否你已经启动服务器.
    if(m_app.m_lpDispatch != NULL) {

    AfxMessageBox("Server already started.");
    return;

    }

    char buf[256]; // General purpose buffer.

    // 打开自动化服务器.
    COleException e;

    if(!m_app.CreateDispatch("Word.Application.8", &e)) {

    sprintf(buf, "Error on CreateDispatch(): %ld (%08lx)",e.m_sc, e.m_sc);
    AfxMessageBox(buf, MB_SETFOREGROUND);
    return;

    }

    // 通过自动化使服务器变得可见.

    // I.e.: Application.Visible = TRUE

    DISPID dispID;
    unsigned short *ucPtr;
    BYTE *parmStr;
    ucPtr = L"visible";

    m_app.m_lpDispatch->GetIDsOfNames(IID_NULL, &ucPtr, 1, LOCALE_USER_DEFAULT, &dispID);
    parmStr = (BYTE *)( VTS_VARIANT );
    m_app.InvokeHelper(dispID, DISPATCH_METHOD | DISPATCH_PROPERTYPUT, VT_EMPTY,NULL, parmStr, &COleVariant((short)TRUE));

    // 事件获得.

    // {000209F7-0000-0000-C000-000000000046}

    static const GUID IID_IWord8AppEvents = {0x000209f7,0x000,0x0000,{0xc0,0x00,0x0,0x00,0x00,0x00,0x00,0x46 } };

    // 建立事件步骤

    // 1. 得到服务器的IConnectionPointContainer接口.
    // 2. 调用IConnectionPointContainerFindConnectionPoint()寻找到希望获得的接口
    // 3. 调用IConnectionPoint::Advise()

    HRESULT hr;

    // 得到服务器的IConnectionPointContainer接口.
    IConnectionPointContainer *pConnPtContainer;
    hr = m_app.m_lpDispatch->QueryInterface(IID_IConnectionPointContainer,(void **)&pConnPtContainer);
    ASSERT(!FAILED(hr));

    // 为使你感兴趣的事件找到联系点.
    hr = pConnPtContainer->FindConnectionPoint(IID_IWord8AppEvents,&m_pConnectionPoint);
    ASSERT(!FAILED(hr));

    // 得到你的事件实现的IUnknown界面.
    LPUNKNOWN pUnk = m_myEventSink.GetInterface(&IID_IUnknown);
    ASSERT(pUnk);

    // 建立advisory联系!
    hr = m_pConnectionPoint->Advise(pUnk, &m_adviseCookie);
    ASSERT(!FAILED(hr));

    // 释放IConnectionPointContainer
    pConnPtContainer->Release();

    下面是"Quit and Clean Up"按钮的处理句柄代码:

    // 如果你已启动服务器.

    if(m_app.m_lpDispatch == NULL) {

    AfxMessageBox("You haven't started the server yet.");

    return;

    }

 

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接