我用下面这段代码获取word文件的内容,在文档没有加过密码时一切正常,但是当文档加过密码或者文档不是一个正常的doc文件的时候就会出错,我希望当一个doc文件被加过密码或者不能被正常读取的时候就跳过这些文档,不知道要怎么做,请各位帮帮忙,谢谢了。AfxOleInit();//初始化Ole为调用Word做准备//初始化Word对象
CApplication0 app;
CDocument1 doc;
CRange0  aRange; 
if(!app.CreateDispatch("Word.Application"))
{
    AfxMessageBox("初始化Word出错!",MB_OK,NULL);
    gv_sThdSearchFile=_T("文件查询结束!");
    return 0;
}COleVariant  vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);    app.put_Visible(FALSE);
CDocuments0 docs = app.get_Documents();
doc=docs.Open(COleVariant(filename),vFalse,vTrue,vFalse,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt);//获取整个文档的内容
aRange=doc.Range(vOpt,vOpt); 
CString strDoc;
strDoc = aRange.get_Text();
CDocuments0 docs2 = app.get_ActiveDocument();
docs2.Close(vOpt,vOpt,vOpt);

//退出Word
VARIANT SaveChanges,OriginalFormat,RouteDocument; //定义调用QUIT时使用的参数
SaveChanges.vt=VT_BOOL; //设置退出WORD时候的保存参数
SaveChanges.boolVal=VARIANT_FALSE; //为不保存任何文档,模板及设置
::VariantInit(&OriginalFormat); //清空变量
RouteDocument.vt=VT_EMPTY; //清空变量的另一种方法
//调用Quit退出WORD应用程序。当然不调用也可以,那样的话WORD还在运行着那
app.Quit(&SaveChanges,&OriginalFormat,&RouteDocument);
app.ReleaseDispatch(); //释放对象指针。切记,必须调用

解决方案 »

  1.   

    尝试用异常捕捉机制:try
    {
    }
    catch (...)
    {
     //把所有的异常都处理
    }
      

  2.   

    我也想过用异常捕捉的办法,这个办法的问题是它会显示出word并且要你输入密码,你点击取消之后才会抛出异常,我希望的是这个窗口不会显示出来或者知道某个文件有密码就不再用word打开它了,不知道有没有办法。
      

  3.   

    我以前跟踪过Word2000的:====================================
    Office 2000 - Word文档 ◇◆※ 密码标记[第524字节] ※◆◇
    无密码: 52BF 0000
    只有打开权限密码: 53BF 0034
    只有修改权限密码: 5ABF 0000
    双密码: 5BBF 0034====================================估计更高版本的也差不多吧。
      

  4.   


      你的 Office 是哪个版本?也许不同版本的标记位置不一样吧。
      明天有空‘研究’-下 Office 2003 的,我最高的就是这个版本了。今天有点晚了,我还得用我的“温酒吧”才能把它搞定,“利器”都在那个系统下。
      有结果明天晚上给你回复。
      

  5.   


    我今天中午试了下Office 2003的Word文档,结果是跟Office 2000的一样。不过纠正6楼一点小错误:(文件字节序号从0开始算)
    应该为:(文件字节序号从1开始算)时隔太久,记错了。 ^_^
    楼主再看一下。