我用VC写了一个操作Word的程序,大致如下:
1.首先,设定一个“模版.doc ”,在其中设定好书签
2.通过读取“模版.doc ”将数据库中的数据按照“模版.doc ”设定的书签位置写入一个新的.doc文件中,这个文件是新建的,之后再保存改文件
(程序中读取“模版.doc”文件时用到Open())问题:
当我再运行程序前,开启任意.doc文件,若不关闭的话,那么程序执行时会报错“Word无法保存此文件,因为它已在别处打开”
我发现此时,进程列表中有两个WINWORD.EXE进程而正常情况下,无论我们打开多少.doc文件,进程列表中都只有一个WINWORD.EXE进程还请各位多多指教,如何解决这个问题?
不胜感激!

解决方案 »

  1.   

    这个问题我做的时候也是一样的,所以我只能想办法执行完就关闭word,其他的解决方法我也不知道
      

  2.   

    其实WORD工作的时候他有一个temp临时文件.  我想可能是打开文件的时候将temp创建将内容拷贝到temp后  此时就开始关闭了源文件.之后你做的修改其实只是在temp中的修改.当保存的时候在进行文件操作.这样便不会产生正在使用的问题了.
      

  3.   

    参看下面文章:
    http://www.joyvc.cn/ComponentDevelop/ComponentDevelop00009.html
    http://www.joyvc.cn/ComponentDevelop/ComponentDevelop00012.html
    http://www.joyvc.cn/ComponentDevelop/ComponentDevelop00015.htmlhttp://www.joyvc.cn/ComponentDevelop/ComponentDevelopGroup00021.html
      

  4.   

    正好我刚做完一个MFC操作WROD的东东.不知你能不能用上.
    COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
    //开始一个新的Microsoft Word 2000实例
    _Application oWordApp;
    if(!oWordApp.CreateDispatch("Word.Application",NULL))
    {
    AfxMessageBox("创建 Word 服务失败!请确认您的系操中已安装了 Microsoft Office 组件。", MB_OK|MB_SETFOREGROUND);
    return;
    }
    //创建一个新的word文档
    Documents oDocs;
    _Document oDoc;
    oDocs=oWordApp.GetDocuments();
    oDoc=oDocs.Add(vOpt,vOpt,vOpt,vOpt);  
    //如果是word 98,则应该带两个参数,如oDocs.Add(vOpt, vOpt)
    //把文本添加到word文档
    Selection oSel;
    oSel=oWordApp.GetSelection();
    //保存word文档
    _Document oActiveDoc; 
    oActiveDoc=oWordApp.GetActiveDocument();
    oActiveDoc.SaveAs(COleVariant(file_pathname),COleVariant((short)0),vFalse, COleVariant(""), vTrue, COleVariant(""),vFalse, vFalse, vFalse, vFalse, vFalse);
    //退出word应用程序
    oWordApp.Quit(vOpt, vOpt, vOpt);
    //把文本添加到word文档
    COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
    _Application m_App;//定义Word提供的应用程序对象
    oSel.ReleaseDispatch();
    oDocs.ReleaseDispatch();//断开关联
    m_App.m_bAutoRelease=true;
    if(!m_App.CreateDispatch("Word.Application"))

    AfxMessageBox("创建Word2000服务失败!请确认您的系操中已安装了 Microsoft Office 组件。"); 
    exit(1); 
    }
    //下面是定义VARIANT变量
    COleVariant varFilePath(file_pathname);
    COleVariant varstrNull("");
    COleVariant varZero((short)0);
    COleVariant varTrue(short(1),VT_BOOL);
    COleVariant varFalse(short(0),VT_BOOL);
    oDocs.AttachDispatch(m_App.GetDocuments());//将Documents类对象oDocs和Idispatch接口关联起来
    oDocs.Open(varFilePath,varFalse,varFalse,varFalse,varstrNull,varstrNull,varFalse,varstrNull,varstrNull,varTrue,varTrue,varTrue);
    //打开Word文档; 
    oSel.AttachDispatch(m_App.GetSelection());//将Selection类对象oSel和Idispatch接口关联起来
    oSel.InsertAfter("要写入的文字"); 
    //保存word文件
    oDoc=m_App.GetActiveDocument(); 
    oDoc.SaveAs(COleVariant(file_pathname),COleVariant((short)0),vFalse,COleVariant(""),vTrue,COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);
    oSel.ReleaseDispatch();
    oDocs.ReleaseDispatch();//断开关联
    //退出WORD 
    m_App.Quit(vOpt,vOpt,vOpt); 
    m_App.ReleaseDispatch();
      

  5.   

    上面是忘了指明是谢谢scq2099yt 的!
      

  6.   

    上面是谢谢scq2099yt !
    当然同样感谢wangminjing提供的代码,不过,你的代码和我目前的代码基本类似,执行时应该会出现同样的问题!
    我昨天晚上看了一篇贴子,上面好像有值得我们注意的地方,就是先判断是否已经有WINWORD.EXE,如果有就不再创建。大致的代码如下:
    COleVariant        vTrue((short)TRUE),  
                             vFalse((short)FALSE),  
                             covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);// 缺省对象    CComVariant        tpl(lpszFilePath),
                                 NewTemplate(false), 
                                 DocType(0), 
                                Visble;    CComVariant        SaveChanges(false),
                                OriginalFormat, 
                                RouteDocument;
        
        CApplication        oWordApp    ; 
        CDocuments        oDocs        ; 
        CDocument0        oDoc        ;  
        HRESULT            hr        ;
        IUnknown           *pUnk    ;
        IDispatch           *pDisp    ;
        CLSID                clsid    ;
      
        hr = CoInitialize( NULL );    //ASSERT( !FAILED(hr) );
        if ( FAILED(hr) ){ 
            AfxMessageBox( TEXT("failed   to   call   CoInitialize()" ));
        }    CLSIDFromProgID( TEXT("Word.Application"),   &clsid );
     
        // 查看是否有已经打开的Word对象
        hr = GetActiveObject( clsid,   NULL,   (IUnknown**)&pUnk );
      
        // 若有word在运行,就得到当前运行word的实例 
        if ( !FAILED(hr) ){
          
            hr = pUnk->QueryInterface( IID_IDispatch,  (void   **)&pDisp );
            ASSERT( !FAILED(hr) );        oWordApp.AttachDispatch( pDisp, TRUE );        pUnk -> Release();
        
      
        }
        // 若无,则新建一个Word对象
        else {
          
            if ( !oWordApp.CreateDispatch( TEXT( "Word.Application" ),NULL) ){             AfxMessageBox( TEXT( "创建ms_word对象失败" ) ); 
                rval = RC_CANCELED_BY_USER ;
                goto PROC_END ;        }
        }    // 创建文档 
        oDocs.AttachDispatch(  oWordApp.get_Documents() );      // 打开一个新文档,将文件的内容添加到新文档中
        oDoc.AttachDispatch(  oDocs.Add( &tpl , &NewTemplate , &DocType , &Visble ) );     //===================================
        // 其他处理word文件的代码
        //===================================== 
       
         // 关闭word文档
        //oWordApp.Quit( vFalse, &OriginalFormat, &RouteDocument ); // 若用此方法关闭word,则用户打开的word也被关闭,用close          
        oDoc.Close( vFalse, &OriginalFormat, &RouteDocument );// vFalse若为vTrue,则新文档不能关闭 
    这篇文章是huimin yu写的,大家可以去看看:
    file:///C:/Documents%20and%20Settings/Administrator/桌面/查看是否有已经打开的Word对象%20-%20yuhuimin111的专栏%20-%20CSDNBlog.mht
    她是用VS 2005写的代码
    其中的CLSIDFromProgID( TEXT("Word.Application"),   &clsid );在我的机器安装的VC 6.0环境下,老是报错,说什么第一个变量无法转换成第二个变数,还请大家帮忙找找原因。谢谢!
      

  7.   


    兄弟,地址应该是这样的:http://blog.csdn.net/yuhuimin111/archive/2008/09/10/2910260.aspx
      

  8.   

    不好意思!
    忘了我是保存在自己机器上的。
    谢谢swjtu_lqb的提示。
      

  9.   

    不好意思!
    忘了我是保存在自己机器上的。
    谢谢swjtu_lqb的提示。