| 发表于: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的备份与恢复的源代码愿意给我学习一用,那就太感谢了。 期待各位的回答。。。。 |
|
|
|
|