首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 怎么判断word文档是否已关闭 [已结贴,结贴人:heytry]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • heytry
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-16 18:48:16 楼主
    CLSID clsid;
    CLSIDFromProgID(L"Word.Application", &clsid); 
    CComPtr <IUnknown>  spUnk = NULL;
    CComPtr <IDispatch> spDisp = NULL;
    HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&spUnk);
    if(SUCCEEDED(hr))
    {
    hr = spUnk->QueryInterface(IID_IDispatch, (void **)&spDisp);
    if(SUCCEEDED(hr))
    {
    m_app.AttachDispatch(spDisp);
    m_sel.AttachDispatch(m_app.GetSelection());
    }
    }

    像上面的代码获取word窗口是选中的文本.因为在程序里还要进行其它处理.
    当在程序运行的过程中关闭word窗口后就会报错:对象已被删除.
    怎么判断word文档是否已关闭?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • manbaum
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-16 19:38:351楼 得分:0
    使用连接点,连接word退出消息。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • heytry
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-16 19:57:382楼 得分:0
    能不说具体点,最好给点代码.
    因为我对Word自动化不是很熟。谢谢。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • manbaum
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-16 20:17:273楼 得分:5
    C++的没写过,C#写过。有个ApplicationEvents2_Event_DocumentBeforeClose事件。
    你可以用vc自带的oleview工具查看word.application的idl定义,获得所有接口方法的说明。
    可连接的事件都是在 dispinterface 里。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • heytry
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-16 20:27:384楼 得分:0
    有没办法通过m_app或m_sel来判断word文档是否已关闭呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • heytry
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-16 20:29:145楼 得分:0
    我其实不想捕获word关闭消息,
    只是在应用程序中使用m_app和m_sel时想知道它们是否还有效。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mackz
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 4

      6

      7

    发表于:2008-05-16 22:19:226楼 得分:5
    你手动调用QueryInterface获取的接口指针,都要调用一下AddRef(),这样Word程序即使在外面关掉,也不会导致你的程序出错了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • heytry
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-17 00:30:487楼 得分:0
    加了AddRef也不行呀。

    在关闭word后,如果我再使用m_app的话:
    m_app.GetSelection(..);

    弹出:RPC服务器不可用


    我不一定要在word关闭后还能继续使用m_app,
    我只想知道在我调用m_app.GetSelection的时候会不会出错,有没办法判断m_app是否还可以使用?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • manbaum
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-18 00:10:398楼 得分:10
    据我的经验是只能通过响应word关闭事件来处理。AddRef()没用的。上次回复的不准确,word关闭事件是 ApplicationEvents2_Event_Quit,在.net里是叫这个,不知道idl里具体啥名,我没查。

    使用连接点的过程大致如下:
    1、获得word.application的IDispatch指针后,QueryInterface获得IConnectionPointContainer接口指针;
    2、从IConnectionPointContainer接口中获得IConnectionPoint指针;
    3、用MFC的Wizard创建一个新MFC类,继承CCmdTarget,选择支持连接点;
    4、Wizard会在你的类里生成一个嵌套类,此类实现了IDispatch接口,并在你的类里声明此嵌套类的实例成员;
    5、用此实例成员的指针作为参数,调用IConnectionPoint接口的Advise()方法;
    6、到此为止,已经将你的类连接到了word的事件上。继续往下。
    7、Wizard会生成一个OnEvent方法,需要你手工实现,实现方法如下;
    8、通过idl定义,获得名称为ApplicationEvents2_Event_Quit的dispid;
    9、判断如果OnEvent参数里的dispid不是此事件的dispid,则忽略,否则继续;
    10、到此,说明收到了word退出的消息,你该怎么清理你的指针,是你的事了。

    以上是个大概过程说明。在MFC里写这个是好久以前的事了,呵呵,所以可能有的记忆不是很准确,你可以按此步骤试试,另外你自己查查文档。有问题再说。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved