用VB能否打开thumbs.db数据库文件,把其中的缩略图显示在VB的图片框里?解决思路

用VB能否打开thumbs.db数据库文件,把其中的缩略图显示在VB的图片框里?
我最近在研究VB的缩略图显示图片问题,各种方法都试了,但速度和系统缩略图相比太慢了,我以为是XP系统有特殊的、速度极快绘图方法不为我们所知,但是仔细想一想,XP系统也是用GDI+绘图,但我用GDI+绘图就快不起来呢?一直很不解,今天浏览网页,无意中发现这样一段话:
windows xp显示缩略图原理是这样的:首先读取当前目录中的thumbs.db文件,该文件记录了该目录下所有图片的缩略图信息;如果该文件不存在或其中没有该图片的缩略图信息,系统会尝试读取图片的exif信息,看是否存在缩略图信息;如果还是没有,系统将自动生成,并将缩略图信息保存在thumbs.db文件中。 thumbs.db是个隐藏文件.
原来XP系统显示的缩略图并非是当时绘的,而是早就存在于thumbs.db数据库文件中,这就是它快的密诀。thumbs.db我原以为是ACDSee的文件,原来是这种东东!

我的问题是:用VB能否打开thumbs.db数据库文件,把其中的缩略图显示在VB的图片框里。
本人可用分很多,若有人能解决此问题,另外再送200分。
顶贴有分。



------解决方案--------------------
sf~~~~~~~~~~~~
------解决方案--------------------
bd~~~~~~~~~~
------解决方案--------------------
db~~~~~~~~~
------解决方案--------------------
绑定,早就知道xp有这个功能了,而且还能预读取视频截图呢。
------解决方案--------------------
能,这是一个数据库文件,早前看到这样的文章还是代码来着,我给忘了
lz 可根据这个线索 google下,看看是什么数据,有什么特殊结构... 
然后自己解文件取数据就行了
------解决方案--------------------
http://blog.csdn.net/downmoon/archive/2009/06/04/4241315.aspx
http://www.cnblogs.com/downmoon/archive/2009/06/04/1495915.html
------解决方案--------------------
没搞过,帮顶
------解决方案--------------------
我也顶一下,能解决就好。
------解决方案--------------------
我讨厌控件,没控件不能完成吗?
------解决方案--------------------
另外我还想知道这是一个什么格式的文件(或说这是哪一种数据库文件)??

------解决方案--------------------


手机代理上网真的象蜗牛爬一样~~~~~~~~~~~~~~~~~~~
------解决方案--------------------
不懂,帮顶。。。貌似这个软件可以查看thumbs.db。。。

http://www.skycn.com/soft/27308.html
------解决方案--------------------
C/C++ code

//找到一个C++的
//Thumbs.db 文件怎么打开 

#include <stdlib.h> 
#include <stdio.h> 

#define NFIELDS 5 
#define TRUE 1 
#define FALSE 0 

/* DBF文件头结构 */ 
struct dbf_head{ 
char vers; 
unsigned char yy,mm,dd; 
unsigned int no_recs; 
unsigned short head_len,rec_len; 
char reserved[20]; 
}; 

/* DBF字段描述结构 */ 
struct field_element{ 
char field_name[11]; 
char field_type; 
unsigned int offset; 
unsigned char field_length; 
unsigned char field_decimal; 
char reserved1[2]; 
char dbaseiv_id; 
char reserved2[10]; 
char production_index; 
}; 

char *dbf_fields_name[NFIELDS]={ 
"a", "b","c","d","e" 
}; 

/* 全局变量 */ 
struct dbf_head file_head; 
struct field_element *fields; 
int *length; 
unsigned int *offset; 

/* 整形数字节顺序改变函数 */ 
void revert_unsigned_short(unsigned short *a) 
{ 
unsigned short left,right; 
left=right=*a; 
*a=((left&0x00ff)<<8)|((right&0xff00)>>8); 
} 

void revert_unsigned_int(unsigned int *a) 
{ 
unsigned int first,second,third,forth; 
first=second=third=forth=*a; 
*a=((first&0x000000ff)<<24)|((second&0x0000ff00)<<8)| 
((third&0x00ff0000)>>8)|((forth&0xff000000)>>24); 
} 

/* 主函数代码 */ 
void main() 
{ 
register int i,j; 
FILE *fp_dat; 
char *buffer; 
char *allspace; 
int fields_count, matched=FALSE; 
unsigned int counts; 

/* 打开dbf文件 */ 
if((fp_dat=fopen("a.dbf","rb"))==NULL){ 
fprintf(stderr,"Cannot open dbf file to read!\n"); 
exit(1); 
} 

/* 读取表头纪录 */ 
fseek(fp_dat,0L,SEEK_SET); 
fread((void*)&file_head,sizeof(struct dbf_head),1,fp_dat); 
revert_unsigned_int(&file_head.no_recs); 
revert_unsigned_short(&file_head.head_len); 
revert_unsigned_short(&file_head.rec_len); 

/* 计算字段数 */ 
fields_count=(file_head.head_len-sizeof(struct dbf_head)-1-263)/sizeof(struct field_element); 

/* 开辟存储字段子记录的空间 */ 
if((fields=(struct field_element*)malloc(sizeof(struct field_element)*fields_count))==NULL){ 
fprintf(stderr,"Cannot allocate memory for fields array !\n"); 
fclose(fp_dat); 
exit(2); 
} 

/* 开辟存储一条数据记录的空间 */ 
if((buffer=(char*)malloc(sizeof(char)*file_head.rec_len))==NULL){ 
fprintf(stderr,"Cannot allocate memory for record buffer!\n"); 
fclose(fp_dat); 
exit(3); 
} 

/* 开辟一个全为空格的纪录,以便后面做比较 */ 
if((allspace=(char*)malloc(sizeof(char)*file_head.rec_len))==NULL){ 
fprintf(stderr,"Cannot allocate memory for all_space record buffer!\n"); 
fclose(fp_dat); 
exit(4); 
} 
else{ 
memset((void*)allspace,'\x20',file_head.rec_len-1); 
allspace[file_head.rec_len]='\0'; 
} 

/* 读取所有的字段子记录,调整整形数的字节顺序 */ 
fread((void*)fields,sizeof(struct field_element),fields_count,fp_dat); 
for(i=0;i<fields_count;i++) 
revert_unsigned_int(&fields[i].offset); 

/* 计算各个字段的字节偏移量,第一字节为删除标记 */ 
fields[0].offset=1; 
for(i=1;i<fields_count;i++) 
fields[i].offset=fields[i-1].offset+(unsigned short)fields[i-1].field_length; 

/* 开辟存储字段长度和偏移量的数组 */ 
length=(int*)malloc(sizeof(int)*fields_count); 
offset=(unsigned int*)malloc(sizeof(unsigned int)*fields_count); 
if(length==NULL||offset==NULL){ 
fprintf(stderr,"Cannot allocate memory for array length or offset.\n"); 
exit(-1); 
} 

/* 找到所需字段的偏移量和长度,如果没有相应字段,程序退出 */ 
for(i=0;i<NFIELDS;i++) 
{ 
for(j=0;j<fields_count;j++) 
{ 
if(strcmp(dbf_fields_name[i],fields[j].field_name)==0) 
{ 
offset[i]=fields[j].offset - 1; 
length[i]=fields[j].field_length; 
matched=TRUE; 
break; 
} 
if(!matched){ 
fprintf(stderr,"dbf file structure is invalid, field %s not found.\n", dbf_fields_name[i]); 
exit(-1); 
} 
else 
matched=FALSE; 
} 
} 

/* 定位文件指针到数据记录的开始位置 */ 
fseek(fp_dat,(long)file_head.head_len,SEEK_SET); 

/* 读取每条记录的字段数据 */ 
for(counts=0;counts<file_head.no_recs;counts++) 
{ 
/* 如果有删除标记,跳到下一条记录 */ 
if(fgetc(fp_dat)==(int)'\x2a') 
{ 
fseek(fp_dat,(int)file_head.rec_len-1,SEEK_CUR); 
continue; 
} 
fread((void*)buffer,(int)file_head.rec_len-1,1,fp_dat); 
buffer[file_head.rec_len]='\0'; 

/*去掉全为空格的记录行*/ 
if(strcmp(buffer,allspace)==0) 
continue; 
} 

fclose(fp_dat); 

/* 释放开辟的空间 */ 
free(buffer); 
free(allspace); 
free(offset); 
free(length); 
//一个c++语言编写的db程序