天天看点

在一个MFC工程中调用Word ActiveX自动化

http://www.5xsoft.com/Article.aspx?id=241

近一周在实际复旦OA的一个辅助公文流转的ActiveX控件,发现了一些新的东西。

  1.在一个MFC工程中调用Word ActiveX自动化。

  用ClassWizard中通过添加类From TypeLib来自动添加调用的接口类,TypeLib是office安装目录里的以OLB为扩展名的文件,Office2k的为MSWORD9.OLB,Office2k3的为MSWORD.OLB,选中你要使用的类就可以生成了,当然也可以把所有的类都选中,如果你不闲看着一堆无用的东西烦的话。

  一般的过程:

打开WORD

CoInitialize(NULL); //初始化OLE环境

if(!wordapp.CreateDispatch(_T("Word.Application"))) //创建WORD分派,启动WORD进程

{

AfxMessageBox(_T("请先安装Word后再处理OA公文"));

return 1;

}

CComVariant CovOptional=CComVariant("");

try{

wordapp.SetVisible(false); //将WORD窗口设为用户不可见

docs.AttachDispatch(wordapp.GetDocuments()); //获取docs接口

CComVariant FileName=CComVariant((LPCSTR)m_localFilePath);

CComVariant CovFalse=CComVariant(false);

CComVariant CovTrue=CComVariant(true);

doc=docs.Open(&FileName,&CovFalse,&CovFalse,&CovFalse,&CovOptional,&CovOptional,&CovFalse,&CovOptional, &CovOptional,&CovTrue,&CovTrue,&CovTrue); //打开文档并获取新文档的接口

doc.Activate(); //激活文档

}catch(CException *ex)

{

ex->ReportError();

ex->Delete();

return 7;

}

其中的定义

Application wordapp=NULL;

Documents docs=NULL;

_Document doc=NULL;

设置修订

Options ops=NULL;

CComVariant CovOptional;

try{

ops=wordapp.GetOptions();//获取Options接口

if (m_revisionOption!=2)

{

ops.SetInsertedTextColor(-1); //设置插入修订颜色按作者不同

ops.SetInsertedTextMark(3);

ops.SetDeletedTextColor(-1); //设置删除

ops.SetDeletedTextMark(1);

}

wordapp.SetUserName((LPCTSTR)m_username); //设置操作者用户名

if(m_revisionOption==0)

{

doc.SetPrintRevisions(true); //设置打印修订

doc.SetShowRevisions(true); //设置显示修订

}else

{

doc.SetPrintRevisions(false);

doc.SetShowRevisions(false);

}

if(m_revisionOption==2)

{

doc.SetTrackRevisions(false); //设置记录修订

}else

{

doc.SetTrackRevisions(true);

}

}catch(CException *ex)

{

ex->ReportError();

ex->Delete();

}

if(ops!=NULL)

ops.ReleaseDispatch();

return 0;

操作书签

Bookmarks bms=NULL;

Bookmark bm=NULL;

Range range=NULL;

try{

doc.SetTrackRevisions(false);

bms=doc.GetBookmarks(); //获取Bookmarks接口

bm=bms.Item(&CComVariant(lpszName)); //按书签名获取Bookmark接口

range=bm.GetRange(); //获取书签的操作范围接口

range.SetText(lpszText); //设置书签的文本

}catch(CException *ex)

{

ex->ReportError();

ex->Delete();

}

if(range!=NULL)

range.ReleaseDispatch();

if(bm!=NULL)

bm.ReleaseDispatch();

if(bms!=NULL)

bms.ReleaseDispatch();

return 0;

关闭Word并保存

CComVariant SaveChanges=CComVariant(true);

CComVariant CovOptional;

wordapp.Quit(&SaveChanges,&CovOptional,&CovOptional); //退出并保存

if(doc!=NULL)

doc.ReleaseDispatch();

if(docs!=NULL)

docs.ReleaseDispatch();

wordapp.ReleaseDispatch();

wordapp=NULL;

CoUninitialize(); //关闭OLE环境

以上是我用到的一些东西,其实Word ActiveX非常功能强大,WORD就是它,它就是WORD,它里面有无数的东西,这些东西你可以从WORD的宏编辑器里,有一个对象浏览器,你可以看到,或者是用ActiveX TypeLib的查看器来查看它的Typelib。至于那些方面的参数里的VARIANT型的参数,你可通过Office的帮助或者录制宏然后再用宏编辑器查看到。

继续阅读