我现在完成VC读写word的功能,若是有word已经打开,或是有WINWORD.EXE这个进程存在时,我的应用程序就报错,
我该怎么办呢?怎么重新启动一个word使我的App不受已存在的word进程WINWORD.EXE的影响?
我打开使用以下方法:  CApplication wordapp; 
 
  COleVariant  covTrue((short)TRUE), 
       covFalse((short)FALSE), 
       covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);   CDocuments   oDocs(wordapp.get_Documents());    //  Use  the  Constructor   CDocument0   oDoc; 
   
  if( !wordapp.CreateDispatch( TEXT("Word.Application" )) ) {

   AfxMessageBox( TEXT("创建Word2003服务失败!") );
   //exit(1);
  } 
   //wordapp.Set_Visible(TRUE); // 显示文档   oDoc.AttachDispatch( oDocs.Open(COleVariant( TEXT("e:\\BuildJobEdit.rtf") ,VT_BSTR), 
  covFalse,  //Confirm  Conversions. 
  covFalse,  //  Not  read  only. 
  covTrue,    //  Add  to  recent  documents. 
  covOptional,    //  PassWordDocument. 
  covOptional,    //  PassWordTemplate. 
  covFalse,  //  Revert. 
  covOptional,    //  WritePasswordDocument. 
  covOptional,    //  WritePasswordTemplate. 
  covOptional,    //  Format,  e.g.,  WordOpenFormat. 
  covOptional,    //  New  with  Word  9  -  Encoding 
  covOptional,    //  Visible  -  Ditto 
  covOptional,    //  New  with  Word  10  -  OpenConflictDocument 
  covOptional,    //  Ditto  -  OpenAndRepair 
  covOptional,    //(long)  0,    //  Ditto  -  DocumentDirection  -  Left  to  Right 
  covOptional      //  Ditto  -  NoEncodingDialog 
  ) 
  ); 

解决方案 »

  1.   

    以前好像用过这种问题,没在意,帮你顶。你查一下函数库或msdn看有没有解释。
      

  2.   

    在使用CreateDispatch创建之前,先使用GetActiveObject查一下是否有正在运行的,如果有就不用创建了。
      

  3.   

    试试下面的代码:        COleVariant vTrue((short)TRUE), vFalse((short)FALSE),
    vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR); _Application App;//定义Word提供的应用程序对象;
    Documents Docs;//定义Word提供的文档对象;
    Selection Sel;//定义Word提供的选择对象;
    Docs.ReleaseDispatch();
    Sel.ReleaseDispatch();
    App.m_bAutoRelease=true;
    if(!App.CreateDispatch("Word.Application"))

    AfxMessageBox("创建Word2000服务失败!"); 
    exit(1); 
    }
    App.SetVisible(true); //下面是定义VARIANT变量;
    strFn = "d:\\abc\\test.doc";
    COleVariant varFilePath(strFn);
    COleVariant varstrNull("");
    COleVariant varZero((short)0);
    COleVariant varTrue(short(1),VT_BOOL);
    COleVariant varFalse(short(0),VT_BOOL);
    Docs.AttachDispatch(App.GetDocuments());//将Documents类对象Docs和Idispatch接口关联起来;
    Docs.Open(varFilePath,varFalse,varFalse,varFalse,
    varstrNull,varstrNull,varFalse,varstrNull,
    varstrNull,varTrue,varTrue,varTrue);
    //打开Word文档; 
    Sel.AttachDispatch(App.GetSelection());//将Selection类对象m_Sel和Idispatch接口关联起来;
      

  4.   

    在使用CreateDispatch创建之前,先使用GetActiveObject查一下是否有正在运行的,如果有就不用创建了。
      

  5.   

    在使用CreateDispatch创建之前,先使用GetActiveObject查一下是否有正在运行的,如果有就不用创建了。这个方法我用了,可是不起作用,各位帮忙看一下,错在哪里??? 代码如下: CLSID clsid;
    CLSIDFromProgID( TEXT("Word.Application"), &clsid);   IUnknown *pUnk = NULL;

    HRESULT hr = ::GetActiveObject(clsid,NULL,&pUnk); // 若有word在运行,就得到当前运行word的实例
    if ( S_OK == hr) { oWordApp = hr;

    }
    // 若没有,就新创建一个
    else {
    // 首先新建立一个word实例对象   
    if ( !oWordApp.CreateDispatch( TEXT("Word.Application") , NULL) ){  AfxMessageBox( TEXT( "CreateDispatch   failed." ) , MB_OK|MB_SETFOREGROUND);  
    //rval = RC_ERR_PARAM;
    //goto PROC_END;
    return;
    }
    }
      

  6.   

    oWordApp = hr; 有错,应该写什么呢?
      

  7.   

    谢谢cofanz的提示,我已经做出来了。到我的博客上去看答案吧,问题就出在oWordApp = hr;
      

  8.   

    CLSID   clsid    ;
    CLSIDFromProgID( TEXT("Word.Application"),   &clsid );
    请问在你的Blog中的“查看是否有已经打开的Word对象”文章中,这两句话是起什么作用的?为什么在VC6.0下老是报错,说无法将第一个变量转换成第二个变量。
    谢谢!