//{{AFX_MSG_MAP(CTestDlg)
......
ON_MESSAGE(WM_OPEN_PPT,OpenPPT)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CTestDlg::OnInitDialog()
{
......
AfxBeginThread(test,(LPVOID)this);
}
UINT CTestDlg::test(LPVOID pParam)
{
CTestDlg* pDlg = (CTestDlg*)pParam;
::SendMessage(pDlg->m_hWnd,WM_OPEN_PPT,NULL,NULL);
}
VOID CTestDlg::OpenPPT(WPARAM wParam,LPARAM lParam)
{
AfxOleInit();
_Application oApp;
if(!oApp.CreateDispatch("PowerPoint.Application"))
{
return;
}
}
线程开始的时候我已经AfxOleInit()了啊?为什么还会CreateDispatch失败呢?
望高手赐教!!
11 个解决方案
#1
写错了,AfxOleInit()是放在了这里:
UINT CTestDlg::test(LPVOID pParam)
{
AfxOleInit();
CTestDlg* pDlg = (CTestDlg*)pParam;
::SendMessage(pDlg->m_hWnd,WM_OPEN_PPT,NULL,NULL);
}
UINT CTestDlg::test(LPVOID pParam)
{
AfxOleInit();
CTestDlg* pDlg = (CTestDlg*)pParam;
::SendMessage(pDlg->m_hWnd,WM_OPEN_PPT,NULL,NULL);
}
#2
安装PowerPoint了没有。
#3
安装了,在主线程中就可以,就是在子线程中不行.
#4
if(!oApp.CreateDispatch("PowerPoint.Application"))
{
return;
}
///////////
catch(_com_error e)
{}
看能不能抓到错误
{
return;
}
///////////
catch(_com_error e)
{}
看能不能抓到错误
#5
子线程中也要 AfxOleInit()或CoInitialize
#6
我试过了,catch不到了,GetLastError()得到的是1008(试图引用不存在的令牌)
而且我在子线程的最开始已经AfxOleInit了.
如果不是先SendMessage让主线程去打开ppt而直接在子线程中打开那么也是可以的.
而且我在子线程的最开始已经AfxOleInit了.
如果不是先SendMessage让主线程去打开ppt而直接在子线程中打开那么也是可以的.
#7
顶之
#8
没有人遇到过吗?这是很正常的应用啊......
再顶!
再顶!
#9
我在做word的时候遇到过运行到
oApp.CreateDispatch( "word.Application ",NULL)
这句错误
catch(_com_error e)
{}
抓不到错误,后来重新安装了一次vc 这个问题 居然神奇的没了
后来程序写好后
拷到别人的机子上 有一些机子有错误 有一些没错误
程序做成Release版本 拷贝到没装vc的机子上没问题
有错误的都是装了vc的
这个问题到现在都没有查到
oApp.CreateDispatch( "word.Application ",NULL)
这句错误
catch(_com_error e)
{}
抓不到错误,后来重新安装了一次vc 这个问题 居然神奇的没了
后来程序写好后
拷到别人的机子上 有一些机子有错误 有一些没错误
程序做成Release版本 拷贝到没装vc的机子上没问题
有错误的都是装了vc的
这个问题到现在都没有查到
#10
我的 问题 解决了 有些装了vc的机子
Debug版本Application.CreateDispatch 创建不成功 返回空指针
Release版本 能通过 并能在所有的机子上用
可能是环境的原因
Debug版本Application.CreateDispatch 创建不成功 返回空指针
Release版本 能通过 并能在所有的机子上用
可能是环境的原因
#11
创建代码在消息处理函数里面,怎么可能是在子线程里呢?消息处理都是在同一个线程里的
#1
写错了,AfxOleInit()是放在了这里:
UINT CTestDlg::test(LPVOID pParam)
{
AfxOleInit();
CTestDlg* pDlg = (CTestDlg*)pParam;
::SendMessage(pDlg->m_hWnd,WM_OPEN_PPT,NULL,NULL);
}
UINT CTestDlg::test(LPVOID pParam)
{
AfxOleInit();
CTestDlg* pDlg = (CTestDlg*)pParam;
::SendMessage(pDlg->m_hWnd,WM_OPEN_PPT,NULL,NULL);
}
#2
安装PowerPoint了没有。
#3
安装了,在主线程中就可以,就是在子线程中不行.
#4
if(!oApp.CreateDispatch("PowerPoint.Application"))
{
return;
}
///////////
catch(_com_error e)
{}
看能不能抓到错误
{
return;
}
///////////
catch(_com_error e)
{}
看能不能抓到错误
#5
子线程中也要 AfxOleInit()或CoInitialize
#6
我试过了,catch不到了,GetLastError()得到的是1008(试图引用不存在的令牌)
而且我在子线程的最开始已经AfxOleInit了.
如果不是先SendMessage让主线程去打开ppt而直接在子线程中打开那么也是可以的.
而且我在子线程的最开始已经AfxOleInit了.
如果不是先SendMessage让主线程去打开ppt而直接在子线程中打开那么也是可以的.
#7
顶之
#8
没有人遇到过吗?这是很正常的应用啊......
再顶!
再顶!
#9
我在做word的时候遇到过运行到
oApp.CreateDispatch( "word.Application ",NULL)
这句错误
catch(_com_error e)
{}
抓不到错误,后来重新安装了一次vc 这个问题 居然神奇的没了
后来程序写好后
拷到别人的机子上 有一些机子有错误 有一些没错误
程序做成Release版本 拷贝到没装vc的机子上没问题
有错误的都是装了vc的
这个问题到现在都没有查到
oApp.CreateDispatch( "word.Application ",NULL)
这句错误
catch(_com_error e)
{}
抓不到错误,后来重新安装了一次vc 这个问题 居然神奇的没了
后来程序写好后
拷到别人的机子上 有一些机子有错误 有一些没错误
程序做成Release版本 拷贝到没装vc的机子上没问题
有错误的都是装了vc的
这个问题到现在都没有查到
#10
我的 问题 解决了 有些装了vc的机子
Debug版本Application.CreateDispatch 创建不成功 返回空指针
Release版本 能通过 并能在所有的机子上用
可能是环境的原因
Debug版本Application.CreateDispatch 创建不成功 返回空指针
Release版本 能通过 并能在所有的机子上用
可能是环境的原因
#11
创建代码在消息处理函数里面,怎么可能是在子线程里呢?消息处理都是在同一个线程里的