您的位置:程序门 -> 移动平台 -> windows mobile



pim备份与恢复


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


[向提问]pim备份与恢复
发表于:2008-01-04 17:27:17 楼主
大家好,我想写一段pim.vol的备份与恢复的代码。
备份的代码如下:
bool   pimbackup()  
{  
ceguid   ceguidpim;  
ceguid   ceguidpimbackup;  

//initialisation  
create_invalidguid(&ceguidpim);  
create_invalidguid(&ceguidpimbackup);  

if(!cemountdbvolex(&ceguidpim,   l"\\pim.vol",   null,   open_existing))  
{  
dword   dwerro   =   getlasterror();  
return   false;  
}  

if(!cemountdbvolex(   &ceguidpimbackup,   l"\\pim_backup.vol",   null,   create_always   ¦   edb_mount_flag))  
{  
return   false;  
}  

handle   hdatabaseenumhandle   =   invalid_handle_value;  
if((hdatabaseenumhandle   =   cefindfirstdatabaseex(&ceguidpim,   0))   ==   invalid_handle_value)  
{  
return   false;  
}  

ceoid   ceoidfind   =   0;  
while(ceoidfind   =   cefindnextdatabaseex(hdatabaseenumhandle,   null))  
{  
handle   hsession   =   cecreatesession(&ceguidpim);  
handle   hdbopened   =   invalid_handle_value;  

hdbopened   =   ceopendatabaseinsession(
hsession,
&ceguidpim,  
&ceoidfind,  
null,
null,  
cedb_autoincrement,  
null);
if(hdbopened   ==   invalid_handle_value)  
{  
dword   error   =   getlasterror();
return   false;  
}  

//   get   informations  
by_handle_db_information   hdbopenedinfo;  
hdbopenedinfo.wversion   =   2;   //must   be   set   to   2
if(!cegetdbinformationbyhandle(hdbopened,   &hdbopenedinfo))  
{  
dword   dwerror   =   getlasterror();
return   false;  
}  


ceoidinfoex   cddb;
ceoid   ceoidfindrecorde;
cddb.wversion   =   2   ; //20080104-add
ceoidgetinfoex2(&ceguidpim,ceoidfindrecorde,   &cddb);

//   create   a   copy  
ceoid   ceoiddbasecopy   =   0;  

cepropspec   cepropspecbasecopy;
cepropspecbasecopy.wversion=1;

if(!(ceoiddbasecopy   =   cecreatedatabasewithprops(
&ceguidpimbackup,  
&hdbopenedinfo.infdatabase,
0,
&cepropspecbasecopy)))
{
dword   dwerro   =   getlasterror();
return   false;  
}  

//open   the   copy  
handle   hsession2   =   cecreatesession(&ceguidpimbackup);  
handle   hdbasecopyhandle   =   invalid_handle_value;  
hdbasecopyhandle   =   ceopendatabaseinsession(
hsession2,
&ceguidpimbackup,
&ceoiddbasecopy,  
hdbopenedinfo.infdatabase.szdbasename,
null,  
cedb_autoincrement,  
null);  

if(hdbasecopyhandle   ==   invalid_handle_value)  
{  
return   false;  
}  

//   get   informations  
by_handle_db_information   hdbopenedinfo2;  
hdbopenedinfo2.wversion   =   2;  
if(!cegetdbinformationbyhandle(hdbasecopyhandle,   &hdbopenedinfo2))  
{  
dword   dwerror   =   getlasterror();
return   false;  
}  

dword   dwcpt   =   0;  
ceoid   ceoidfindrecord   =   0;  
word   dwpropid   =   0;  
cepropval*   buffer   =   null;
cepropval   cepropvalseek;
dword   dwsizeofbuffer   =   0;  
handle   hheap   =   null;  
hheap   =   getprocessheap();  
if(hheap   ==   null)  
return   false;  
while(ceoidfindrecord   =   cereadrecordpropsex(
hdbopened,   //   handle   of   the   database
cedb_allowrealloc,   //   use   localalloc   to   get   the   buffer
&dwpropid,   //   number   of   properties   retrieved
null,   //   null   means   retrieve   all   properties.
(lpbyte*)&buffer,   //   buffer   receives   property   data.
&dwsizeofbuffer,   //   handle   to   the   heap   for   allocating   the   record   when
//   cedb_allowrealloc   is   specified
hheap))   //   a   handle   to   an   application-created
dwcpt++;


if(getlasterror()   !=   error_no_more_items)
return   false;
free(buffer);  
buffer   =   null;  
ceseekdatabaseex(hdbopened,   cedb_seek_beginning,   0,   0,   null);  
ceoidfindrecord   =   0;
dword   dwnumberofrecordfound   =   0;
while(dwnumberofrecordfound++   <   dwcpt)  
{  
//   find   record  
ceoidfindrecord   =   cereadrecordpropsex(
hdbopened,   //   handle   of   the   database.
cedb_allowrealloc,   //   use   localalloc   to   get   the   buffer.
&dwpropid,   //   number   of   properties   retrieved
null,   //   null   means   retrieve   all   properties.
(lpbyte*)&buffer,   //   buffer   receives   property   data.
&dwsizeofbuffer,   //   handle   to   the   heap   for   allocating   the   record   when  
//   cedb_allowrealloc   is   specified.  
hheap);   //   a   handle   to   an   application-created  
if(!ceoidfindrecord)  
{  
dword   dwerror   =   getlasterror();
return   false;  
}  

//   add   property   in   backupdb
ceoid   ceoidrecordadd;
ceoidrecordadd   =   cewriterecordprops(
hdbasecopyhandle,   //   handle   to   db  
0,   //   0=>   add   new   record
dwpropid,   //   propid  
buffer);   //   blob   buffer   record  


//   buffer
if(!ceoidrecordadd)  
{  
dword   dwerror   =   getlasterror();  
messagebox(0,   l"error",   l"error",   1);  
return   false;  
}
else
{
//messagebox(0,   l"ok",   l"ok",   1);  
}
//free(temp);  
//temp   =   null;  
free(buffer);  
buffer   =   null;  
}

}  

if(!ceflushdbvol(&ceguidpim))  
return   false;  
if(!ceflushdbvol(&ceguidpimbackup))  
return   false;  
if(!ceunmountdbvol(&ceguidpim))  
return   false;  
if(!ceunmountdbvol(&ceguidpimbackup))  
return   false;  
return   true;  
}  
我想将通过函数cereadrecordpropsex得到的buffer作为函数cewriterecordprops最后一个参数的输入,可是总是不对,cewriterecordprops返回总是0,我用getlasterror得到的是5,即error_access_denied,不知该怎么改进,有哪位高手可以给我帮助?非常谢谢了。
如果有哪位大侠有pim.vol或cemail.vol的备份与恢复的源代码愿意给我学习一用,那就太感谢了。
期待各位的回答。。。。
发表于:2008-01-05 00:00:221楼 得分:0
有两种情况会产生error_access_denied错误:
        *     a   property   was   added   with   db_prop_notnull   set   and   null   is   given   as   the   value   for   that   property,  
or   you   try   to   delete   that   property.
        *   the   database   has   sort   orders   that   have   the   cedb_sort_nonnull   flag,   and   one   of   the   corresponding  
properties   in   the   updated   or   inserted   record   is   null   or   is   deleted.  

仔细检查最末参数prgpropval是否违背了上面的规则。详细请参考:
发表于:2008-01-05 09:21:562楼 得分:0
唉,我就是不知道该怎样改进才提问的,这些资料肯定都看过了的。
谢谢楼上的,没有别的高手愿意帮忙吗?
发表于:2008-01-05 14:16:583楼 得分:0
是分太少了吗?高手跑哪去了呀,好伤心。。。。
发表于:2008-01-08 10:25:504楼 得分:0
自己顶一个,郁闷中。。。。
发表于:2008-01-08 10:56:225楼 得分:0
给个想法参考
    用cegetdatabaseprops   获取   cepropspec   数组
    将buffer的值转化为cepropspec     数组形式再写入
发表于:2008-01-08 15:32:156楼 得分:0
cepropval可以转换为cepropspec?怎么转?转了怎么用?
主要是cewriterecordprops这个函数总是返回0,应该是某个字段是db_prop_notnull但实际为null,所以总是失败。
但是,我是直接读源表然后写目标表,怎么会有这种情况呢,不明白,不知能否有更详细的帮助?
谢谢。
发表于:2008-01-08 17:03:497楼 得分:0
能读取到字段的属性吗?列举一下每个字段属性,马上就能找到出问题的字段。
发表于:2008-01-09 17:49:238楼 得分:0
唉,还是没有弄好,烦。。。。


快速检索

最新资讯
热门点击