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的帮助或者录制宏然后再用宏编辑器查看到。