ThumbsLib in C++
ThumbsLib is a library that is able to read the thumbnails from the thumbs.db file of Windows XP system.
The original version of this library was created in C# by petedavis in his website: http://www.petedavis.net/drupal//index.php?q=node/2
For some reason, I need a C++ version of this lib. So I looked for some information on the OLE storage interface, and translated this lib into C++.
The thumbs.db uses the Micorsoft Compound File Format which could be operated by the IStorage interface. This Compound File Format looks like a small file system in it. There maybe “directory” of ”file” contained, and represented as “IStorage” interface and “IStream” interface.
We could create an IStorage interface from StgOpenStorage.
There is a “Catalog” “file” contained in any thumbs.db file which stores all the thumbnails’ information.
Catalog contains a catalog header and a list of catalog item. You could get each thumbnail’s actual filename from the catalog item.
The data structure is like below:
struct CatalogHeader {
int number1;
int thumbCount;
int thumbWidth;
int thumbHeight;
};
struct CatalogItem {
int num1;
int itemID; // thumbnail’s ID, when we need to get the thumbnail’s data, we need this ID
FILETIME filetime;
std::wstring filename; // the file’s original filename
short num7; // seems always to be zero
};
For the detial how we get the thumbnail from the thumbs.db, you may like to visit petedavis’ website.
You could download this lib at: thumbslib
This ThumbsLib (in C++) is easy to use, for example:
ThumbDB dbFile(_T(“.\thumbs.db”));
vector<wstring> aFiles(dbFile.GetThumbFiles());
for (vector<wstring>::iterator itr = aFiles.begin();
itr != aFiles.end();
++itr)
{
dbFile.SaveThumbDataToFile((*itr).c_str(), szBuf);
}
====================中文介绍===================
ThumbsLib 是一个用于读取Windows XP系统下文件缩略图缓存文件thumbs.db的C++程序库。
原始的ThumbDBLib是一个由petedavis使用C#编写的,该库发表在他的个人网站上的:http://www.petedavis.net/drupal//index.php?q=node/2
由于我需要一个C++版本的读取thumbs.db的库,因此我查阅了一些关于OLE存储接口的资料,并将ThumbDBLib翻译成C++版本的。
thumbs.db使用了Micorsoft Compound File Format,我们可以使用 IStorage interface接口访问&操作该文件。这种文件格式内部模拟了一个小的文件系统,其中有文件夹的概念以及文件的概念。在实际使用中,我们用IStorage来操作“文件夹”,用IStream操作“文件”。
使用 StgOpenStorage 函数可以创建一个IStorage接口。
thumbs.db文件中有一个特殊的名为“Catalog”的Stream,其中包含了所有缩略图的相关信息。
“Catalog”中包含一个CatalogHeader,以及一系列的CatalogItem。
struct CatalogHeader {
int number1;
int thumbCount;
int thumbWidth;
int thumbHeight;
};
struct CatalogItem {
int num1;
int itemID; // 缩略图ID,我们需要用这个ID构建一个用于打开thumbs.db中各个缩略图实际数据的Stream的文件名。
FILETIME filetime;
std::wstring filename; // 被缓存缩略图文件的原文件名
short num7; // 这个字段似乎总是0
};
更详细的信息,可以参考petedavis’ website中原作者对thumbs.db文件的分析。
点此下载C++版的thumbslib: thumbslib
ThumbsLib的使用与原先的C#版类似,如下:
ThumbDB dbFile(_T(“.\thumbs.db”));
vector<wstring> aFiles(dbFile.GetThumbFiles());
for (vector<wstring>::iterator itr = aFiles.begin();
itr != aFiles.end();
++itr)
{
dbFile.SaveThumbDataToFile((*itr).c_str(), szBuf);
}