DWORD _stdcall ThreadFun(LPVOID p)
{CoInitialize(NULL);
CApplication  objWordApp;            //word对象
COleVariant ovTrue((short)TRUE);    //true
COleVariant ovFalse((short)FALSE);  //false
COleVariant ovOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //创建一个IDispatch指针
if (!objWordApp.CreateDispatch("Word.Application"))
{
AfxMessageBox("Couldn't get Word object.");
return -1;
}
objWordApp.put_Visible(TRUE);              //显示应用程序
objWordApp.put_DisplayAlerts(FALSE); CDocuments  docs(objWordApp.get_Documents()); //word文档
//CComVariant NewTemplate(false),DocumentType(0),Visible;
//docs.Add(ovOptional,&NewTemplate,&DocumentType,&Visible);
CDocument0  docPrint;                        //word文档 COleVariant FileName(LPCTSTR(_T("f:\\3.docx")));COleVariant tempFormat(long(wdOpenFormatDocument),VT_I4);
 
docPrint=docs.Open(FileName, ovFalse,
ovTrue, ovFalse,
&ovOptional,&ovOptional, 
&ovOptional, &ovOptional, 
&ovOptional,&tempFormat,
ovOptional,ovFalse,  
ovFalse, &ovOptional,
ovTrue, &ovOptional);open函数崩溃,参数我特意查了, msdn只有2个是必须的,其他都是可选的,所以应该没有问题注意第11个参数

解决方案 »

  1.   


      
    void __cdecl _NMSG_WRITE (
            int rterrnum
            )中:         */            if (rterrnum != _RT_CRNL && rterrnum != _RT_BANNER && rterrnum != _RT_CRT_NOTINIT)
                {
                    if (1 == _CrtDbgReport(_CRT_ERROR, NULL, 0, NULL, rterrs[tblindx].rterrtxt))
                        _CrtDbgBreak();
                }
    #endif  /* _DEBUG */
                if ( (_set_error_mode(_REPORT_ERRMODE) == _OUT_TO_STDERR) ||
                     ((_set_error_mode(_REPORT_ERRMODE) == _OUT_TO_DEFAULT) &&
                      (__app_type == _CONSOLE_APP)) )
                {
      

  2.   

    从这里抛出异常:
    void COleDispatchDriver::InvokeHelperV(DISPID dwDispID, WORD wFlags,
    VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, va_list argList)
    {
    // make the call
    SCODE sc = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags,
    &dispparams, pvarResult, &excepInfo, &nArgErr);// throw exception on failure
    if (FAILED(sc))
    {
    VariantClear(&vaResult);
    if (sc != DISP_E_EXCEPTION)
    {
    // non-exception error code
    AfxThrowOleException(sc);
    } // make sure excepInfo is filled in
    if (excepInfo.pfnDeferredFillIn != NULL)
    excepInfo.pfnDeferredFillIn(&excepInfo); // allocate new exception, and fill it
    COleDispatchException* pException =
    new COleDispatchException(NULL, 0, excepInfo.wCode);
    ASSERT(pException->m_wCode == excepInfo.wCode);
            if (::SysStringLen(excepInfo.bstrSource))
    {
    pException->m_strSource = excepInfo.bstrSource;
    }
            ::SysFreeString(excepInfo.bstrSource);
    if (::SysStringLen(excepInfo.bstrDescription))
    {
    pException->m_strDescription = excepInfo.bstrDescription;
    }
            ::SysFreeString(excepInfo.bstrDescription);
            if (::SysStringLen(excepInfo.bstrHelpFile))
    {
    pException->m_strHelpFile = excepInfo.bstrHelpFile;
    }
            ::SysFreeString(excepInfo.bstrHelpFile);
    pException->m_dwHelpContext = excepInfo.dwHelpContext;
    pException->m_scError = excepInfo.scode; // then throw the exception
    THROW(pException); //这里抛出异常了