下载本文示例代码
下载源代码
关键字:Foxmail, 随身邮,账号
环境:Windows 98SE/2000,VC 6.0,Foxmail 4.1 简体中文版
摘要
本文旨在介绍 Foxmail 的账号存储机制,并基于此编写一个辅助工具 SmartFox ,实现闪存“随身邮”功能。
问题的出现与分析
最近我买了一支爱国者的经典型“迷你王”闪存,自己安装了 Foxmail ,并在闪存上创建了两个账号以收发邮件。但当我在另一台 PC 上使用 Foxmail 时,它却提示没有可用的账号。这是怎么回事呢?原来, Foxmail
在创建账号时,会将这个账号所在目录完整的路径名记录下来。由于闪存在不同的 PC 上获得的盘符不一定相同,这样在闪存的盘符改变后, Foxmail
便因无法定位该目录而发生错误。
开始时,我编辑了一个批处理文件 Foxmail.BAT 用以启动 Foxmail 。其思路是将闪存的根
目录重定向为 Z:
盘,每次将闪存的当前盘符作为参数传递给这个批处理文件即可。为此我不得
不将之前创建的账号删除,在命令行提示符下启动批处理命令,然后在 Z:
盘下创建账号。这样
不是太麻烦了吗?是的!我也曾尝试过利用中间文件自动进行参数传递,但是由于 DOS
的不可重入性而不能保证每次都成功运行。因此我开始剖析 Foxmail 的账号存储机制。
Foxmail 的账号存储机制
Foxmail 将每个账号的最基本信息(账号名称、存储目录)存放在安装目录下的文件
Accounts.CFG 中。在每个账号的目录中则利用文件
Account.STG 存储该账号的其他信息。
Accounts.CFG 是一个复合文档,它包括一个 Ver30 存储( Storage )。在
Ver30 存储下有一个accounts.cfg 流( Stream )。你可以使用 Visual Studio 6.0 提供的 DocFile
阅读器打开它。关于存储和流的更多知识,请参阅 MSDN: [Platform SDK] Structured Storage 。
经过分析,我得到了 Foxmail 的账号存储机制。如下即为 accounts.cfg 流的 C 语言描述结构(表中均为十六进制):
偏移地址 |
变量名 |
描述 |
00000000 |
BYTE Reserved [40]; |
文件头。在 00000007 处存储了曾创建账号的个数。 |
00000040 |
DWORD cAccount; |
现有的账号数。 |
第一个账号信息块( AIB , Account Information Block )的开始。 |
00000044 |
DWORD idxAccount; |
该账号的顺序编号。 |
|
DWORD lenACTName; |
账号名字符串的长度。 |
|
String strACTName [lenACTName]; |
账号名字符串。 |
|
DWORD lenACTPath; |
账号所在目录的字符串长度。 |
|
String strACTPath [lenACTPath]; |
账号所在目录的全路径名。 |
|
BYTE Reserved [18]; |
0x18 个 00 (可能用以存储密码)。 |
下一个 AIB |
… |
注意:所有的字符串长度均不包括结尾符在内。 |
下载本文示例代码
阅读(214) | 评论(0) | 转发(0) |