看了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环境下,老是报错,说什么第一个变量无法转换成第二个变数,还请大家帮忙找找原因。谢谢!
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环境下,老是报错,说什么第一个变量无法转换成第二个变数,还请大家帮忙找找原因。谢谢!
解决方案 »
- Socket客户端运行一周后调用socket(AF_INET,SOCK_STREAM,0))失败?
- 在对话框中添加进度条控件(设置为Disble),怎么在代码中修改它的可视属性?
- 聊天室中的缓存
- 急求VC动态库写法,要能在C#,Delphi和VB中成功调用
- 关于CString奇怪的问题???
- 关于COM的调用
- 菜鸟问题 问在赋值时如何才能用以一维赋值代替二维赋值????
- 关于Release的问题。
- 一个关于CAsyncSocket::Listen的极简单的问题
- 请推荐SOCKET的好书?
- 如何禁止HtmlView的右键菜单的查看源代码
- 我已一个USB设备在设备管理中的名称,如何得到它的com口?
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 );
之后不论哪个版本下都不会出问题。
几天前我已经查出了原因,现在程序已经调试成功了。
不过还是谢谢你!^_^