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

SYSSZ 2009-09-03 08:39:05
我最近在研究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分。
顶贴有分。

...全文
444 点赞 收藏 30
写回复
30 条回复
a1096448857 2012年09月24日
来看看。。。
回复 点赞
huangshuo1024 2010年05月10日
正在为图片缩略图苦恼心伤。百度了一下,看见你的帖子。哎……
对VB6.0心生恐惧。
而且看了很多gdi+,看不懂!
回复 点赞
SYSSZ 2009年09月05日
没人回这个贴了?大家都不知道如何弄?我有点想结贴了.
回复 点赞
SYSSZ 2009年09月05日
自己顶一下!
回复 点赞
toury 2009年09月05日
第一步成功:

Dim conn As New ADODB.Connection
Dim path$
path = App.path & "\" 'path 是文件夹,Thumbs.db是文件名。表名是Thumbs

Call SetAttr(path, vbNormal)
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path & ";Extended Properties=Paradox 5.x;Persist Security Info=False"
conn.Open connstr
Debug.Print conn.State'成功

Dim rs As New Recordset
rs.Open "SELECT * FROM Thumbs", conn, 1, 1'失败。。。
Debug.Print rs.EOF

回复 点赞
toury 2009年09月05日
用这个数据库连接字符串试试:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & path & "';Extended Properties=Paradox 5.x;Persist Security Info=False"
回复 点赞
toury 2009年09月05日
别沉
回复 点赞
dingyanwei 2009年09月04日
先顶顶,再看看
回复 点赞
SYSSZ 2009年09月04日
顶贴有分,没错,就是散分.
回复 点赞
king06 2009年09月04日
[Quote=引用楼主 syssz 的回复:]
我的问题是:用VB能否打开thumbs.db数据库文件,把其中的缩略图显示在VB的图片框里。
本人可用分很多,若有人能解决此问题,另外再送200分。
顶贴有分。
[/Quote]
帮顶了
回复 点赞
jjhhgg1111 2009年09月04日
up
回复 点赞
chinaboyzyq 2009年09月04日

//找到一个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程序
回复 点赞
bluesky396 2009年09月04日
不懂,帮顶。。。貌似这个软件可以查看thumbs.db。。。

http://www.skycn.com/soft/27308.html
回复 点赞
m60a1 2009年09月04日
蹭分:)
回复 点赞
东方之珠 2009年09月04日
来顶顶,再看看
回复 点赞
SYSSZ 2009年09月03日
六楼提供的链接中东东,怎样弄成在VB6.0下也可运行?
回复 点赞
chinaboyzyq 2009年09月03日


手机代理上网真的象蜗牛爬一样~~~~~~~~~~~~~~~~~~~
回复 点赞
SYSSZ 2009年09月03日
测试遇到困难,我只装了VB net2005,可例子好象是VB net2008写的,打不开说是高版本写的,想把它转成VB6.0代码,困难也不小,谁安装了VB net2008先测试一下.
回复 点赞
chinaboyzyq 2009年09月03日
另外我还想知道这是一个什么格式的文件(或说这是哪一种数据库文件)??
回复 点赞
SYSSZ 2009年09月03日
[Quote=引用 10 楼 chinaboyzyq 的回复:]
我讨厌控件,没控件不能完成吗?
[/Quote]
同感!你动动脑筋看能否去掉控件?
回复 点赞
发动态
发帖子
多媒体
创建于2007-09-28

621

社区成员

8284

社区内容

VB 多媒体
社区公告
暂无公告