• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            wince上如何讀取和備份、刪除聯系人

            讀取聯系人的方法有API和數據庫。這里所說的聯系人有兩個概念,一個是SIM卡上的,一個設備中的。
            想看看如果讀取SIM卡中的聯系人。
            #include
            #pragma comment(lib,"cellcore.lib")

            // CSimPhoneBookView message handlers
            void ReadSimPhoneBook()
            {

            ?//Sim Card
            ?HSIM g_hSim = NULL;
            ?SIMCAPS g_simcaps;
            ?const DWORD g_dwLocation = SIM_PBSTORAGE_SIM;//SIM_PBSTORAGE_OWNNUMBERS;//SIM_PBSTORAGE_SIM;
            ?
            ?DWORD dwRecNum=0;
            ?DWORD dwCurRec = 0;
            ?if (FAILED(SimInitialize(SIM_INIT_NONE, NULL, 0, &g_hSim)))
            ??return;
            ?if (FAILED(SimGetDevCaps(g_hSim, SIM_CAPSTYPE_PBINDEXRANGE, &g_simcaps)))
            ??return;

            ?dwRecNum = g_simcaps.dwMaxPBIndex - g_simcaps.dwMinPBIndex+1;
            ?dwCurRec = g_simcaps.dwMinPBIndex;
            ?SIMPHONEBOOKENTRY simPhoneEntry;??
            ?while( dwCurRec <= dwRecNum )
            ?{
            ??memset(&simPhoneEntry,0,sizeof(SIMPHONEBOOKENTRY));
            ??if(SUCCEEDED(SimReadPhonebookEntry(g_hSim, g_dwLocation, dwCurRec, &simPhoneEntry)))
            ??{
            ???int iItem = lstCtrl.InsertItem(lstCtrl.GetItemCount(),simPhoneEntry.lpszText);
            ???lstCtrl.SetItemText(iItem,1,simPhoneEntry.lpszAddress);
            ???CString tmp;
            ???tmp.Format(_T("%ld"),dwCurRec);
            ???lstCtrl.SetItemText(iItem,2,tmp);
            ??}?
            ??dwCurRec++;
            ?}
            ?
            ?SimDeinitialize(g_hSim);
            ?g_hSim = NULL;?
            }
            void Add()
            {
            ?//Sim Card
            ?HSIM g_hSim = NULL;
            ?SIMCAPS g_simcaps;
            ?const DWORD g_dwLocation = SIM_PBSTORAGE_SIM;//SIM_PBSTORAGE_OWNNUMBERS;//SIM_PBSTORAGE_SIM;
            ?
            ?DWORD dwRecNum=0;
            ?DWORD dwCurRec = 0;
            ?if (FAILED(SimInitialize(SIM_INIT_NONE, NULL, 0, &g_hSim)))
            ??return;
            ?if (FAILED(SimGetDevCaps(g_hSim, SIM_CAPSTYPE_PBINDEXRANGE, &g_simcaps)))
            ??return;

            ?dwRecNum = g_simcaps.dwMaxPBIndex - g_simcaps.dwMinPBIndex+1;
            ?dwCurRec = g_simcaps.dwMinPBIndex;
            ?SIMPHONEBOOKENTRY simPhoneEntry;
            ?simPhoneEntry.cbSize = sizeof(SIMPHONEBOOKENTRY);
            ??? simPhoneEntry.dwParams = SIM_PARAM_PBE_ALL;
            ??? simPhoneEntry.dwAddressType = SIM_ADDRTYPE_NATIONAL;
            ??? simPhoneEntry.dwNumPlan = SIM_NUMPLAN_TELEPHONE;
            ?
            ?CString tmp;
            ?for( dwCurRec = g_simcaps.dwMinPBIndex;dwCurRec<=dwRecNum;dwCurRec++ )
            ?{
            ??tmp.Format(_T("name_%ld"),dwCurRec);
            ??wcscpy(simPhoneEntry.lpszText,tmp);
            ??tmp.Format(_T("123456%.3ld"),dwCurRec);
            ??wcscpy(simPhoneEntry.lpszAddress,tmp);
            ??SimWritePhonebookEntry(g_hSim, g_dwLocation, dwCurRec, &simPhoneEntry);
            ?}

            ?SimDeinitialize(g_hSim);
            ?g_hSim = NULL;?
            }

            //下面的代碼通過系統自帶的數據庫來讀取

            ?int CopyPhoneBook(BOOL FLAG)
            {?
            ?///////////////////////////////////////////////////////////////////////////
            ?//讀數據庫中(在內存中讀寫,只能用API不能用WINCE封裝的類,后者只對用戶自定義的數據庫有用)
            ?//存儲地址本的數據庫是Contacts Database,手機中看不到,加載在內存中?
            ?//////////////////////////////////////////////////////////////////////////
            ?CEGUID ceguid;
            ?TCHAR szVolName[128];
            ?CREATE_INVALIDGUID(&ceguid);
            ?while(::CeEnumDBVolumes(&ceguid,szVolName,MAX_PATH))
            ?{
            ??if(wcsnicmp(L"SystemHeap",szVolName,10)==0)
            ??{
            ???/////將當前數據庫卷定位到SystemHeap上
            ???break;
            ??}
            ?}
            ?
            ?CEOID ceoid;
            ?ceoid = 0;
            ?
            ?CENOTIFYREQUEST *pRequest = (CENOTIFYREQUEST *) LocalAlloc(LPTR,sizeof(CENOTIFYREQUEST));
            ?pRequest->dwSize = sizeof(CENOTIFYREQUEST);
            ?pRequest->hwnd = NULL;
            ?pRequest->hHeap = NULL;
            ?pRequest->dwFlags = CEDB_EXNOTIFICATION;
            ?
            ?//打開聯系人數據庫,并注冊事件
            ?HANDLE hdDB;
            ?hdDB = ::CeOpenDatabaseEx(&ceguid,&ceoid,L"Contacts Database",0,0,pRequest);
            ?
            ?if(hdDB == INVALID_HANDLE_VALUE)
            ?{
            //??AfxMessageBox(L"打開失敗");
            ??return 0;
            ?}
            ?
            ?int iCount;
            ?CEOIDINFO?oldinfo;
            ?CEOID CEoid =0;
            ?if(!CeOidGetInfoEx(&ceguid,ceoid,&oldinfo))
            ?{
            //??AfxMessageBox(L"獲取信息失敗");
            ??return 0;
            ?}
            ?//數據庫的記錄總數
            ?iCount = oldinfo.infDatabase.wNumRecords;
            ?if(0 == iCount)
            ??return 0;?
            ?DWORD dwIndex;
            ?
            ?PBYTE pBuff;
            ?WORD wProps;
            ?DWORD dwRecSize;
            ?PCEPROPVAL pRecord;
            ?
            ?for(int i = 0; i < iCount; ++i)
            ?{
            ??//移動記錄指針
            ??CEoid = CeSeekDatabase(hdDB,CEDB_SEEK_BEGINNING,i,&dwIndex);
            ??
            ??//ASSERT(CEoid !=0);
            ??pBuff = 0;?
            ??//讀取所有字段值
            ??CEoid = CeReadRecordProps(hdDB,CEDB_ALLOWREALLOC,&wProps,NULL,&(LPBYTE)pBuff,&dwRecSize);
            ??/*
            typedef enum
            {
            ?Firstname = 0x3a06001f,//姓
            ?WorkTel? = 0x3a08001f,//工作電話
            ?HomeTel? = 0x3a09001f,//住宅電話
            ?Lastname? = 0x3a11001f,//名
            ?Company?? = 0x3a16001f,//公司/單位
            ?JobTitle = 0x3a17001f,//職務
            ?Department = 0x3a18001f,//部門
            ?OfficeLoc = 0x3a19001f,//辦公室
            ?MobileTel=? 0x3a1c001f,//移動電話
            ?RadioTel =? 0x3a1d001f,//無線電話
            ?CarTel?? = 0x3a1e001f,//車載電話
            ?WorkFax? = 0x3a24001f,//工作傳真
            ?HomeFax? = 0x3a25001f,//住宅傳真
            ?HomeTel2 = 0x3a2f001f ,//住宅電話2
            ?Birthday? = 0x40010040,//生日
            ?Assistant = 0x4002001f,//助理
            ?Anniversary = 0x40030040, //周年紀念
            ?AssistantTel = 0x4004001f,//助理電話
            ?Children = 0x4006001f,//子女
            ?WorkTel2 = 0x4007001f,//工作電話2
            ?HomePage = 0x4008001f,//主頁
            ?Pager = 0x4009001f,//尋呼機
            ?Spouse = 0x400a001f,//配偶
            ?Name = 0x4013001f,//姓名
            ?Title = 0x4023001f,//稱呼(對聯系人)
            ?HomeAddr = 0x4040001f,//家庭地址
            ?HomeCity = 0x4041001f,//家庭所在城市
            ?HomeState = 0x4042001f,//家庭所在的省/州
            ?HomeZip = 0x4043001f,//家庭郵編
            ?HomeCountry = 0x4044001f,//家庭所在國家
            ?WorkAddr = 0x4045001f,//工作地址
            ?WorkCity = 0x4046001f,//工作的城市
            ?WorkState = 0x4047001f, //工作的省/州
            ?WorkZip = 0x4048001f,//工作地的郵編
            ?WorkCountry = 0x4049001f,//工作地的國家
            ?OtherAddr = 0x404a001f,//其他地址
            ?OtherCity = 0x404b001f,//其他城市
            ?OtherState = 0x404c001f,//其他省/州
            ?OtherZip = 0x404d001f,//其他郵編
            ?OtherCountry = 0x404e001f,//其他的國家
            ?Email = 0x4083001f,//電子郵箱
            ?Email2nd = 0x4093001f,//電子郵箱2
            ?Email3rd = 0x40a3001f//電子郵箱3
            }Contacts_field; //Contacts Database的字段,系統定義不可更改
            */
            ??//ASSERT(CEoid !=0);
            ??
            ??pRecord = (PCEPROPVAL)pBuff;
            ??
            ??LPWSTR Mobile = NULL;
            ??LPWSTR NAME = NULL;
            ??
            ??
            ??int Len_Mobile;
            ??int Len_Name;
            ??
            ??CString One;
            ??for(int j = 0; j < wProps; ++j)
            ??{
            ???switch(pRecord->propid)
            ???{
            ???case MobileTel ://移動電話
            ????{
            ?????Mobile = pRecord->val.lpwstr;
            ?????WCharToMByte(Mobile,Mob,sizeof(Mob)/sizeof(Mob[0]));//可將記錄寫入文件中
            ?????
            ????}
            ????break;
            ???case Name://姓名
            ????{
            ?????NAME = pRecord->val.lpwstr;
            ?????WCharToMByte(NAME,Nam,sizeof(Nam)/sizeof(Nam[0]));//可將記錄寫入文件中
            ??????}
            ???default:
            ????break;
            ???}
            ???pRecord ++;
            ??}
            ????LocalFree(pBuff);
            ?}
            ?
            ?//關閉數據庫
            ?if(! CloseHandle(hdDB))
            ?{
            //??MessageBox(NULL,L"關閉數據庫失敗",NULL,MB_OK);
            ??return 0;
            ?}
            ?
            ?if(!FLAG)
            ??f.Close();

            ?if(!FLAG)
            ??DeletePhoneBook();

            //?Sleep(1000);

            ?return 1;
            }
            //
            //刪除聯系人記錄
            void CCellGuardApp::DeletePhoneBook(void)
            {
            ?CEGUID ceguid;
            ?TCHAR szVolName[128];
            ?CREATE_INVALIDGUID(&ceguid);
            ?while(::CeEnumDBVolumes(&ceguid,szVolName,MAX_PATH))
            ?{
            ??if(wcsnicmp(L"SystemHeap",szVolName,10)==0)
            ??{
            ???/////將當前數據庫卷定位到SystemHeap上
            ???break;
            ??}
            ?}
            ?
            ?CEOID ceoid;
            ?ceoid = 0;
            ?
            ?CENOTIFYREQUEST *pRequest = (CENOTIFYREQUEST *) LocalAlloc(LPTR,sizeof(CENOTIFYREQUEST));
            ?pRequest->dwSize = sizeof(CENOTIFYREQUEST);
            ?pRequest->hwnd = NULL;
            ?pRequest->hHeap = NULL;
            ?pRequest->dwFlags = CEDB_EXNOTIFICATION;
            ?
            ?//打開聯系人數據庫,并注冊事件
            ?HANDLE hdDB;
            ?hdDB = ::CeOpenDatabaseEx(&ceguid,&ceoid,L"Contacts Database",0,0,pRequest);
            ?
            ?if(hdDB == INVALID_HANDLE_VALUE)
            ?{
            //??MessageBox(NULL,L"打開失敗",NULL,MB_OK);
            ??return ;
            ?}
            ?
            ?int iCount;
            ?CEOIDINFO?oldinfo;
            ?CEOID CEoid =0;
            ?if(!CeOidGetInfoEx(&ceguid,ceoid,&oldinfo))
            ?{
            //??MessageBox(NULL,L"獲取信息失敗",NULL,MB_OK);
            ??return ;
            ?}
            ?//數據庫的記錄總數
            ?iCount = oldinfo.infDatabase.wNumRecords;
            ?if(0 == iCount)
            ??return ;
            ?
            ?CEOID oid;
            ?DWORD dwIndex;
            ??? oid = CeSeekDatabase(hdDB, CEDB_SEEK_BEGINNING, 0, &dwIndex);
            ?while(oid)
            ??? {
            ??????? // Update GUI with currently selected record
            ??if(!CeDeleteRecord(hdDB, oid))
            ??{;}

            ??????? oid = CeSeekDatabase(hdDB, CEDB_SEEK_CURRENT, 1, &dwIndex);
            ??? }
            ?
            ?//關閉數據庫
            ?if(! CloseHandle(hdDB))
            ?{
            //?br>??return ;
            ?}
            }
            ////////////////////////////////////////////////////////////////////////////////////////
            //?????????????從恢復地址本:從文件中寫數據庫
            ////////////////////////////////////////////////////////////////////////////////////////
            void CCellGuardApp::ReDoAddress(void)
            {
            // TODO: Add your control notification handler code here
            ?/////////////////
            ?// 打開數據庫
            ?/////////////////
            ?CEGUID ceguid;
            ?TCHAR szVolName[128];
            ?CREATE_INVALIDGUID(&ceguid);
            ?while(::CeEnumDBVolumes(&ceguid,szVolName,MAX_PATH))
            ?{
            ??if(wcsnicmp(L"SystemHeap",szVolName,10)==0)
            ??{
            ???/////將當前數據庫卷定位到SystemHeap上
            ???break;
            ??}
            ?}
            ?
            ?CEOID ceoid;
            ?ceoid = 0;
            ?
            ?CENOTIFYREQUEST *pRequest = (CENOTIFYREQUEST *) LocalAlloc(LPTR,sizeof(CENOTIFYREQUEST));
            ?pRequest->dwSize = sizeof(CENOTIFYREQUEST);
            ?pRequest->hwnd = NULL;
            ?pRequest->hHeap = NULL;
            ?pRequest->dwFlags = CEDB_EXNOTIFICATION;
            ?
            ?//打開聯系人數據庫,并注冊事件
            ?HANDLE hdDB;
            ?hdDB = ::CeOpenDatabaseEx(&ceguid,&ceoid,L"Contacts Database",0,0,pRequest);
            ?
            ?if(hdDB == INVALID_HANDLE_VALUE)
            ?{
            //??MessageBox(NULL,L"打開失敗",NULL,MB_OK);
            ??return;
            ?}
            ?

            ?///////////////////////////
            ?//?打開備份地址本的文件
            ?///////////////////////////
            ?CFile f;
            ?CFileException ex;
            ?
            ?if (!f.Open(L"1.txt", CFile::modeRead | CFile::shareDenyWrite, &ex))
            ?{
            ??// complain if an error happened, no need to delete the ex object
            ??TCHAR szError[1024];
            ??ex.GetErrorMessage(szError, 1024);
            ??return;
            ?}
            ?
            ?f.SeekToBegin();
            ?DWORD dwLen = f.GetLength();
            ?//如果文件長度為0,則退出函數
            ?if(0 == dwLen)
            ??return ;
            ?
            ?char * buf = new char[dwLen + 1];
            ?memset(buf, 0, dwLen);
            ?f.Read(buf, dwLen);
            ?f.Close();
            ?
            ?///////////////////////
            ?//?向數據庫中寫數據
            ?///////////////////////
            ?TCHAR NAME[128] = {0};
            ?TCHAR PHONE[36] = {0};

            ?char *Nam;
            ?char *Phone;
            ?char *seps = "\t\r\n";

            ?int Count = 0;
            ?do{
            ??++ Count;
            ??if(1 == Count)
            ???Nam = strtok(buf,seps);
            ??else
            ???Nam = strtok(NULL,seps);

            ??MByteToWChar(Nam,NAME,sizeof(NAME)/sizeof(NAME[0]));

            ??Phone = strtok(NULL,seps);
            ??MByteToWChar(Phone,PHONE,sizeof(PHONE)/sizeof(PHONE[0]));

            ??if(Nam || Phone)
            ??{
            ???//寫入數據庫
            ???CEPROPVAL *pProps;
            ???pProps = new CEPROPVAL[2];
            ???
            ???memset(pProps,0,LocalSize(pProps));
            ???pProps->propid = MobileTel;
            ???pProps->val.lpwstr = PHONE;

            ???pProps ++;

            ???pProps->propid = Name ;
            ???pProps->val.lpwstr = NAME;

            ???//寫到文件中
            ???pProps = pProps -1;
            ???CEOID CEoid = CeWriteRecordProps(hdDB,0,2,pProps);
            ???DWORD ERR = GetLastError();
            ???if(0 == CEoid)
            //????MessageBox(NULL,L"寫數據庫操作失敗!",NULL,MB_OK);

            ???delete []pProps;
            ??}
            ?}while(Nam && Phone);
            ?
            ?//關閉數據庫
            ?if(! CloseHandle(hdDB))
            ?{
            //??MessageBox(NULL,L"關閉數據庫失敗",NULL,MB_OK);
            ??return ;
            ?}
            }

            posted on 2009-04-16 22:53 Benjamin 閱讀(5222) 評論(10)  編輯 收藏 引用 所屬分類: PDA/PPC開發

            評論

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            存儲地址本的數據庫是Contacts Database,手機中看不到,加載在內存中

            那么你這里的意思是Contacts的記錄是放在SystemHeap中?

            而我發現設備的根目錄下不是有個pim.vol文件么,里面就有個Contacts Database。

            pim.vol和SystemHeap又是怎樣的關系呢?麻煩幫忙解答下,謝謝!
            2009-04-28 17:58 | Danielle

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            SystemHeap是卷的名稱,SystemHeap卷是系統對象數據庫所在的數據庫卷:
            pim.vol存放的是通話記錄。
            2009-04-28 18:54 | Benjamin

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            我用下面的代碼沒有讀到SystemHeap卷,環境是Windows mobile 6 professional,博主是不是用的Smartphone環境??還是有其他原因?
            CEGUID ceguid;
            TCHAR szVolName[128];
            CREATE_INVALIDGUID(&ceguid);
            while(::CeEnumDBVolumes(&ceguid,szVolName,MAX_PATH))
            {
            if(wcsnicmp(L"SystemHeap",szVolName,10)==0)
            {
            /////將當前數據庫卷定位到SystemHeap上
            break;
            }
            }

            此外,我讀到的PIM.vol里存放的不僅僅是通話記錄,還包括Contacts, Appointment,Tasks,Speed dial等。并且我已驗證,contacts的數據就是從這個PIM.vol文件里讀的。有些迷惑,還望指點,謝謝。
            2009-04-29 14:00 | Danielle

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            qq:42617930
            MSN:yidan923@163.com
            希望能與博主交流。
            2009-04-29 14:04 | Danielle

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            上面的代碼是在WINCE中運行的,如果是windows mobile系統,則有了專門的COM組件IPOutlookApp來訪問聯系人,當然也可以通過讀取數據庫來獲取,不過,在windows mobile系統下讀取系統的數據庫的接口和wince中的有區別的。
            2009-04-29 21:24 | Benjamin

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            @Benjamin
            你說的是不是POOM呀?
            2009-05-05 14:00 | jon

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            困惑?
            看了您的很多貼,關于CE你加的庫文件都是編譯器里面自己有的么?

            跪求指點~

            msn:breakawayroad@hotmail.com
            2009-07-06 14:09 | Sean

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            @Danielle
            fsasaf
            2012-01-10 16:49 | fa

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            我是用 手機 coolpad N92 wince6.0的系統
            沒有獲取到 SystemHeap卷,請問是怎么回事呢, 有沒其他方式讀取通話記錄,通訊錄這些,謝謝
            2015-03-12 14:25 | liudelu

            # re: wince上如何讀取和備份、刪除聯系人  回復  更多評論   

            SystemHeap,是系統自帶的,系統是定制的嗎?
            2015-04-17 08:43 | Benjamin
            久久精品国产99国产精品| 少妇久久久久久久久久| 国产激情久久久久影院小草 | 精品综合久久久久久97| 久久国产精品99精品国产| 国产激情久久久久影院| 国产成年无码久久久免费| 亚洲国产成人久久综合碰碰动漫3d | 亚洲一级Av无码毛片久久精品| 久久久久久精品免费免费自慰| 国产精品久久久久9999| 色老头网站久久网| 91久久精品国产成人久久| 亚洲午夜无码久久久久| 久久精品国产99久久久香蕉| 国产日产久久高清欧美一区| 久久精品国产亚洲AV香蕉| 久久精品国产WWW456C0M| 国产精品久久久久久影院| 精品一二三区久久aaa片| 欧美国产成人久久精品| 一本久久久久久久| 国产亚洲精品自在久久| 麻豆AV一区二区三区久久| 色婷婷综合久久久久中文字幕 | 精品久久久久久无码人妻蜜桃| 人妻无码中文久久久久专区| 香蕉99久久国产综合精品宅男自 | 久久精品国产亚洲av水果派 | 久久影院综合精品| 亚洲午夜久久久影院伊人| 亚洲午夜久久久久久久久久 | 久久影视国产亚洲| 久久精品国产精品亜洲毛片| 国内精品久久久久影院网站| 久久婷婷久久一区二区三区| 久久亚洲欧美日本精品| 99久久免费只有精品国产| 爱做久久久久久| 久久久久国产亚洲AV麻豆| 一本色道久久综合狠狠躁篇|