站内搜索

高手必修:关于FoxMail的深入研究

    现在使用FoxMail的用户越来越多了,但是FoxMail却不像OutLook一样给编程人员提供开发接口。我认为这对一个好的软件的推广来说是很不利的。前几个月小弟由于开发需要对FoxMail进行了以下研究,这几天闲下来将材料整理了一下,供大家参考。我使用FoxMail4.2进行研究,但是在FoxMail5.0推出后,我也进行了测试,仍然使用。
  
  FoxMail的数据保存,都是由两个文件组成 .Ind 和 .Box的文件,Ind 文件主要记录简单信息,以及详细信息在.Box文件中的起始位置。
  
  地址簿:
  
  默认情况下,FoxMail的地址簿由两个文件组成,Address.ind 和 Address.box。
  
  Address.Ind文件
  
  文件头的范围为00H-39H,共64个字节。
  
  05H保存纪录的个数,12H-21H记录地址薄名称。
  
  记录部分40H开始是第一条记录,每条记录长B0H
  
  每条记录的00H是记录号(从01开始顺序编号),04H是删除标记,该字节为1表明此记录被用户删除(由此可见在FoxMail中删除的信息没有被真正的删除)
  
  05H06H纪录在.BOX中的地址如 [05H]=01,[06H]=EA 那么该项纪录的详细信息被保存在Address.Box文件中起始位置为01FA
  
  09H0AH此记录在.Box文件中详细信息的字节数目加上156H(记录整条记录在Box文件中的总长度)
  
  11H是组记录,该字节为1表明此记录为一条组记录;(我没有对此项进行详细研究)
  
  12H是此项纪录名称的长度,最大为20H;
  
  13H-32H是此项纪录名称的内容
  
  33H是邮件地址长度,最大为40H
  
  34H-73H是邮件地址内容
  
  Address.Box文件
  
  每条记录由“_____________S”开始,后加一回车符(0A0D)
  
  紧接着是详细信息,分别由以下几项组成(按顺序排列)
  
  Emails
  
  Mobile
  
  PagerNum
  
  OICQ
  
  ICQ

  HomePage
  
  Sex
  
  Birthday
  
  FmCountry
  
  FmProvince
  
  FmCity
  
  FmPostcode
    
  FmStreetAddr
  
  HomeTel
  
  HomeTel2
  
  FmFax
  
  Company
  
  OfCountry
  
  OfProvince
  
  OfCity
  
  PostCode
  
  HomeAddress
  
  OfHomePage
  
  OfPosition
  
  OfDepartment
  
  OfficeTel
  
  OfficeTel2
  
  Fax
  
  构造格式:名称 + 冒号 + 0A0D + 信息内容 + 0A0D
  
  最后一项构造完成 要加入2个 0A0D
  
  实例1:
  
  从FoxMail中遍历地址簿联系人姓名和EMail信息:
  
  bool GoAll(char *szFileNameOfInd)

  char headbuf[0x41]; // 头buf
  
  char recbuf[0xb1]; // 内容buf
  
  FILE* pf=fopen(szFileNameOfInd,"rb");
  
  fseek(pf,0x40,SEEK_SET); // 到项目开始
  
  while(!feof(pf))
  
  {
  
  char name[0x21],email[0x41]; // 定义存储姓名和email的字符数组
  
  for(i=0;i<0x21;i++)
  
  name[i]='/0';
  
  for(i=0;i<0x41;i++)
  
  email[i]='/0';
  
  fread(recbuf,1,0xb0,pf); // 读取一条记录
  
  if(recbuf[0x4]==1) // 判断删除标志
  
  {
  continue;
  }
  
  if(recbuf[0x11]==1) // 判断组标志
  
  {
  continue;
  }
  
  for(i=0;i
  {
  if(recbuf[i+0x13]==0)
  
  break;
  
  name[i]=recbuf[i+0x13];
  }
  
  for(i=0;i
  {
  if(recbuf[i+0x34]==0)
  
  break;
  
  email[i]=recbuf[i+0x34];
  }
  
  //此处添加处理name(收件人名),email(收件人地址)的程序

  return true;
  }
  
  实例2:
  
  向地址簿中添加一条记录信息,没有给出全部代码。
  
  1. 得到文件头

  BOOL GetIndFileHead(char* szheadbuf) // 得到文件头部的函数
  
  {
  fseek(FoxWriter_pf_addr,0x0,SEEK_SET);
  
  long len=0;
  
  len=fread(szheadbuf,1,0x40,FoxWriter_pf_addr);
  
  if(len==0)
  return FALSE;
  
  return TRUE;
  
  }
  
  2. 修改项目数;
  
  int itemcount=szheadbuf[0x5];
  
  itemcount++;
  
  szheadbuf[0x5]=itemcount;
  
  3. 修改项目代号
  
  szbuf[0x0]=itemcount;
  
  4. 创建项目名称
  
  szbuf[0x12]=strlen(strItemName);

  for(i=0;i<0x20;i++)
  
  szbuf[i+0x13]=strItemName[i];
  
  5. 创建项目email
  
  szbuf[0x33]=strlen(strEmails);
  
  for(i=0;i<0x40;i++)
  
  szbuf[i+0x34]=strEmails[i];
  
  6. 构造Box文件buf
  
  (略)
  
  7. 创建项目对Box文件指针
  
  char* pbuf=szbuf;
  
  pbuf++;
  
  short* pshbuf=(short*)pbuf;
  
  pshbuf[0x2]=point;
  
  8. 创建项目字数值
  
  long len=strlen(szBoxbuf)
  
  len+=0x156;
  
  9. 保存Ind和Box文件
  
  (未完,将继续整理关于FoxMail发件箱收件箱信息提取的研究)

  • 上一篇:『VC++技术内幕』学习笔记(1)
  • 下一篇:如何利用VC的Remote Debug功能