VC 调用OFFICE,CreateDispatch有关问题
VC 调用OFFICE,CreateDispatch问题
将打开POWERPOINT封装成了一个DLL,实现在功能是将PPT转换为JPG图片;
外部在线程中每次加载DLL,调用接口,然后释放DLL;
以上一切是正常;
现在问题是:
打开比较大的PPT文件时,保存为图片时,比较耗时,所以在线程中进行,每打开来个PPT创建一个线程;但发现连续打一两个PPT文件时,只有在第一个转换完了,第二个PPT才开始转换;
经过跟踪代码,发现在第一个线程未将图片转换完关,第二个线程一直停留在app.CreateDispatch这里,也不返回错误,就是一直等待。
上面是启动的代码,
有大神知道这是为什么吗?为什么不能同时启动多个powerpoint?
COM的初始化肯定进行了,释放也是成对的;DLL内,或者DLL外都进行了尝试,一直是同样的问题。
------解决方案--------------------
在线程里都要调用CoInitialize(NULL)方法,同时office组件好像是有点问题,虽然在外部用ole方式打开了多个文件文件,但其实更像是向同一个进程组件提出操作需求的,以前操作excel时就有类似的问题了
将打开POWERPOINT封装成了一个DLL,实现在功能是将PPT转换为JPG图片;
外部在线程中每次加载DLL,调用接口,然后释放DLL;
以上一切是正常;
现在问题是:
打开比较大的PPT文件时,保存为图片时,比较耗时,所以在线程中进行,每打开来个PPT创建一个线程;但发现连续打一两个PPT文件时,只有在第一个转换完了,第二个PPT才开始转换;
经过跟踪代码,发现在第一个线程未将图片转换完关,第二个线程一直停留在app.CreateDispatch这里,也不返回错误,就是一直等待。
BOOL CPPTManager::InitPPT()
{
AfxMessageBox(_T("InitPPT IN"));
BOOL bCDispatch = app.CreateDispatch(_T("Powerpoint.Application"),NULL);
if (!bCDispatch)
{
AfxMessageBox(_T("InitPPT IN 2"));
return FALSE;
}
else
{
//app.put_Visible(1);//不显示窗体;
AfxMessageBox(_T("InitPPT IN 3"));
}
//BOOL bCDispatch2 = app.CreateDispatch(_T("Powerpoint.Application"), NULL);
AfxMessageBox(_T("InitPPT IN 4"));
return TRUE;
}
上面是启动的代码,
有大神知道这是为什么吗?为什么不能同时启动多个powerpoint?
COM的初始化肯定进行了,释放也是成对的;DLL内,或者DLL外都进行了尝试,一直是同样的问题。
------解决方案--------------------
在线程里都要调用CoInitialize(NULL)方法,同时office组件好像是有点问题,虽然在外部用ole方式打开了多个文件文件,但其实更像是向同一个进程组件提出操作需求的,以前操作excel时就有类似的问题了