首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
VC/MFC
基础类
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
怎么判断word文档是否已关闭
[已结贴,结贴人:heytry]
加为好友
发送私信
在线聊天
heytry
大白菜
等级:
可用分等级:
中农
总技术专家分:
15
总技术专家分排名:
194409
揭帖率:
46.75%
发表于:
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
回复次数:
8
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
manbaum
砸锅上网
等级:
可用分等级:
小地主
总技术专家分:
4936
总技术专家分排名:
4224
发表于:
2008-05-16 19:38:35
1
楼 得分:
0
使用连接点,连接word退出消息。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
heytry
大白菜
等级:
可用分等级:
中农
总技术专家分:
15
总技术专家分排名:
194409
发表于:
2008-05-16 19:57:38
2
楼 得分:
0
能不说具体点,最好给点代码.
因为我对Word自动化不是很熟。谢谢。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
manbaum
砸锅上网
等级:
可用分等级:
小地主
总技术专家分:
4936
总技术专家分排名:
4224
发表于:
2008-05-16 20:17:27
3
楼 得分:
5
C++的没写过,C#写过。有个ApplicationEvents2_Event_DocumentBeforeClose事件。
你可以用vc自带的oleview工具查看word.application的idl定义,获得所有接口方法的说明。
可连接的事件都是在 dispinterface 里。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
heytry
大白菜
等级:
可用分等级:
中农
总技术专家分:
15
总技术专家分排名:
194409
发表于:
2008-05-16 20:27:38
4
楼 得分:
0
有没办法通过m_app或m_sel来判断word文档是否已关闭呢?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
heytry
大白菜
等级:
可用分等级:
中农
总技术专家分:
15
总技术专家分排名:
194409
发表于:
2008-05-16 20:29:14
5
楼 得分:
0
我其实不想捕获word关闭消息,
只是在应用程序中使用m_app和m_sel时想知道它们是否还有效。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
Mackz
在相互
等级:
可用分等级:
掌柜
总技术专家分:
125128
总技术专家分排名:
32
4
6
7
发表于:
2008-05-16 22:19:22
6
楼 得分:
5
你手动调用QueryInterface获取的接口指针,都要调用一下AddRef(),这样Word程序即使在外面关掉,也不会导致你的程序出错了。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
heytry
大白菜
等级:
可用分等级:
中农
总技术专家分:
15
总技术专家分排名:
194409
发表于:
2008-05-17 00:30:48
7
楼 得分:
0
加了AddRef也不行呀。
在关闭word后,如果我再使用m_app的话:
m_app.GetSelection(..);
弹出:RPC服务器不可用
我不一定要在word关闭后还能继续使用m_app,
我只想知道在我调用m_app.GetSelection的时候会不会出错,有没办法判断m_app是否还可以使用?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
manbaum
砸锅上网
等级:
可用分等级:
小地主
总技术专家分:
4936
总技术专家分排名:
4224
发表于:
2008-05-18 00:10:39
8
楼 得分:
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
abc推荐给好友