最近帮朋友弄个程序,处理Office Excel表.该Excel表加了密码,并且含有很多数据,当在VC中通过 Excel Ole对象打开该Excel文档时候出现 "服务器正在运行中“对话框,其中有”切换到。“按钮。
发现问题峩知道这是Ole Server Busy对话框但是我不知为什么会弹出该对话框,是系统默认的还是可以进行定制经过搜索发现微软对该问题进行了解释。
大意昰说:如果你使用了MFC 应用程序并且初始化COM环境使用的是AfxOleInit当执行一个需要很长时间返回的COM调用时就会遇到这个问题。
一般使用MFC客户应用程序包含消息循环,推荐使用AfxOleInit来初始化COM. 而AfxOleInit默认会设置Ole消息过滤器.请看AfxOleInit的源码:
通过查看COleMessageFilter()构造函数会发现默认是会显示Ole Server Busy对话框和Not Responding 对话框的。所以当一个COM调用需要花很长时间才返回出现这个对话框是正常的。
微软官方给出的解决方案是:
即使用了第2种方案对话框是不弹了,但是客户应用还是处于一个freeze的状态所以为了客户应用友好,最好创建一个线程函数在线程函数中显示一个进度条对话框,等待一个Event并且定时处理消息循环,当COM调用返回后设置Event为有信号状态,关闭进度条