看了huimin yu的贴子,是解决VC操作WORD时重复创建Word对象的问题,就是先判断是否已经有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,则新文档不能关闭 
她是用VS 2005写的代码 
其中的CLSIDFromProgID( TEXT("Word.Application"),  &clsid );在我机器安装的VC 6.0环境下,老是报错,说什么第一个变量无法转换成第二个变数,还请大家帮忙找找原因。谢谢!

解决方案 »

  1.   

    改成:
        CLSIDFromProgID( OLESTR("Word.Application"),  &clsid ); 可以看看LPCOLESTR的定义:
    #if defined(_WIN32) && !defined(OLE2ANSI)
    typedef WCHAR OLECHAR;typedef /* [string] */ OLECHAR __RPC_FAR *LPOLESTR;typedef /* [string] */ const OLECHAR __RPC_FAR *LPCOLESTR;#define OLESTR(str) L##str#elsetypedef char      OLECHAR;
    typedef LPSTR     LPOLESTR;
    typedef LPCSTR    LPCOLESTR;
    #define OLESTR(str) str
    #endifVC6用的是上半部分定义,VC8用的是下半部分定义,
    所以原来的代码在VC8下没问题,到VC6下就有问题了。
    改成CLSIDFromProgID( OLESTR("Word.Application"),  &clsid ); 
    之后不论哪个版本下都不会出问题。 
      

  2.   

    谢谢littlepboy的解答!
    几天前我已经查出了原因,现在程序已经调试成功了。
    不过还是谢谢你!^_^