IE收藏夹位于 %USERPROFILE%//Favorites 中,在文件中可以按字母进行排序。然后IE工具栏所显示的顺序并不是按字母排序的,在注册表HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/MenuOrder/Favorites下有一个字段order保存了IE工具栏中的顺序。可以直接把这个键及包含的内容删除,这样IE工具栏中所显示的Favorites顺序就是按字母排序的。
Windows提供了一个COM对象ShellUIHelpers可以操纵IE的Favorites。这个对象提供一个接口 IShellUIHelper 支持函数ImportExportFavorites 可以实现IE收藏的导入和导出,以HTML文件的格式。但是其顺序 不是按字母顺序,也不是按IE工具栏的顺序,具体的排序准则,我也没搞清楚,请会员教之。
如果在自己的程序中希望加入的Favorites和IE工具栏有一样的顺序那只能读取Order的值然后提取顺序。Order的值是以二进制方式存放的,所以要找出数据表示的格式,因为没有找到相关资料,只能一个字节一个字节分析。
每个order开头的8个字节都是不变的,猜想可能是标识之类的。随后的四个字节指出整个order的大小(不包括标识),下面的4个字节,我看到都是1,具体含义没有得出,接着的4个字节就是有多少个favorites项了。
每个favorite项中,开始4个字节是项所占的空间大小。随后的4个字节没有什么变化。再后的4个字节我猜想是编码方式,在实际中我就把这用于编码方式。下面的4个字节,指示当前这个favorite以文件的方式所占的大小,即URL文件大小。再后4个字节不知道是什么意思,随后的2个字节是类型字段,表示是文件夹还是URL文件。下面就是在IE工具栏对应的URL文件名,如果文件名超过8.3,则后面再有一个短文件名。下面是我定义的结构表示。
struct
{
HeaderFavorites int one; // 8 int two; // 2 int TotalSize; // totalsize of buffer not include one and two fields. int four; // 1 int Number; // num of items include folders and files};
struct
{
ItemFavorite int SizeItem; // the size of total bytes in one item int noa; // always FFFFFFFBWORD code1;
// the fields might be used as code page???WORD code2;
int FileSize; // the size of file, if folder, 0; bytesWORD Type;
int noc; // 0x10 folder (FILE_ATTRIBUTE_DIRECTORY); 0x20 url (FILE_ATTRIBUTE_ARCHIVE) to see WIN32_FIND_DATA.dwFileAttributes};
这些都是我猜想出来的,并且已经用于项目,如果有高人更理解相关内容,请教之。
不幸的是,MenuOrder中的数据格式在2K和XP下是不一样的,以上说的是在2K下研究出来的,下面再说说XP下的格式,同样是猜出来的,而且还不完整。作2K一样,header区域是一样的。就是每个Item子项的具体做法不同.
item header
short name
item content
long name
其中第一项和2k没有差别,但是short name的存放长度还是不一样的。其最大长度可以是12个字符,因为是unicode编码,所以是24个byte。如果文件名的长底小于12个字符,那就按实际长度分配。然后就是item的一些信息了,占20个字节,再下面才是实际的文件名。


发布评论