线程中CreateDispatch失败!?

时间:2022-04-28 20:07:23
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{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);
}

#2


安装PowerPoint了没有。

#3


安装了,在主线程中就可以,就是在子线程中不行.

#4


if(!oApp.CreateDispatch("PowerPoint.Application"))
    {
        return;
    }      

///////////
catch(_com_error e)
{}

看能不能抓到错误

#5


子线程中也要  AfxOleInit()或CoInitialize

#6


我试过了,catch不到了,GetLastError()得到的是1008(试图引用不存在的令牌)
而且我在子线程的最开始已经AfxOleInit了.

如果不是先SendMessage让主线程去打开ppt而直接在子线程中打开那么也是可以的.

#7


顶之

#8


没有人遇到过吗?这是很正常的应用啊......

再顶!

#9


我在做word的时候遇到过运行到
oApp.CreateDispatch( "word.Application ",NULL)
这句错误

catch(_com_error   e) 
{}
抓不到错误,后来重新安装了一次vc   这个问题  居然神奇的没了

后来程序写好后

拷到别人的机子上    有一些机子有错误  有一些没错误


程序做成Release版本 拷贝到没装vc的机子上没问题

有错误的都是装了vc的

这个问题到现在都没有查到

#10


我的   问题   解决了       有些装了vc的机子   
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);
}

#2


安装PowerPoint了没有。

#3


安装了,在主线程中就可以,就是在子线程中不行.

#4


if(!oApp.CreateDispatch("PowerPoint.Application"))
    {
        return;
    }      

///////////
catch(_com_error e)
{}

看能不能抓到错误

#5


子线程中也要  AfxOleInit()或CoInitialize

#6


我试过了,catch不到了,GetLastError()得到的是1008(试图引用不存在的令牌)
而且我在子线程的最开始已经AfxOleInit了.

如果不是先SendMessage让主线程去打开ppt而直接在子线程中打开那么也是可以的.

#7


顶之

#8


没有人遇到过吗?这是很正常的应用啊......

再顶!

#9


我在做word的时候遇到过运行到
oApp.CreateDispatch( "word.Application ",NULL)
这句错误

catch(_com_error   e) 
{}
抓不到错误,后来重新安装了一次vc   这个问题  居然神奇的没了

后来程序写好后

拷到别人的机子上    有一些机子有错误  有一些没错误


程序做成Release版本 拷贝到没装vc的机子上没问题

有错误的都是装了vc的

这个问题到现在都没有查到

#10


我的   问题   解决了       有些装了vc的机子   
Debug版本Application.CreateDispatch     创建不成功     返回空指针 
Release版本       能通过       并能在所有的机子上用

可能是环境的原因

#11


创建代码在消息处理函数里面,怎么可能是在子线程里呢?消息处理都是在同一个线程里的