我现在完成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
)
);
我该怎么办呢?怎么重新启动一个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
)
);
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接口关联起来;
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;
}
}
CLSIDFromProgID( TEXT("Word.Application"), &clsid );
请问在你的Blog中的“查看是否有已经打开的Word对象”文章中,这两句话是起什么作用的?为什么在VC6.0下老是报错,说无法将第一个变量转换成第二个变量。
谢谢!