WINCE通过clog.db表来读取和删除通话记录

WINCE通过clog.db表来读取和删除通话记录

  1  void  ReadLog()
  2  {
  3      CEGUID ceguid;
  4       //////////////////////// int MAX_PATH = 1280;
  5      TCHAR szVolName[ 128 ];
  6      CREATE_INVALIDGUID( & ceguid);
  7       while (::CeEnumDBVolumes( & ceguid,szVolName,MAX_PATH))
  8      {
  9           if (wcsnicmp(L " SystemHeap " ,szVolName, 10 ) == 0 )
 10          {
 11               /// //将当前数据库卷定位到SystemHeap上
 12               break ;
 13          }
 14      }
 15      
 16      CEOID ceoid;
 17      ceoid  =   0 ;
 18      
 19      CENOTIFYREQUEST  * pRequest  =  (CENOTIFYREQUEST  * ) LocalAlloc(LPTR, sizeof (CENOTIFYREQUEST));
 20      pRequest -> dwSize  =   sizeof (CENOTIFYREQUEST);
 21      pRequest -> hwnd  =  NULL;
 22      pRequest -> hHeap  =  NULL; 
 23      pRequest -> dwFlags  =  CEDB_EXNOTIFICATION;
 24      
 25       /////////////////////////// /打开联系人数据库,并注册事件
 26      HANDLE hdDB;
 27      hdDB  =  ::CeOpenDatabaseEx( & ceguid, & ceoid,L " clog.db " , 0 , 0 ,pRequest);
 28      
 29       if (hdDB  ==  INVALID_HANDLE_VALUE)
 30      {
 31 
 32           return ;
 33      }
 34 
 35       int  iCount;
 36      CEOIDINFO    oldinfo;
 37      CEOID CEoid  = 0 ;
 38       if ( ! CeOidGetInfoEx( & ceguid,ceoid, & oldinfo))
 39      {;}
 40 
 41 
 42      iCount  =  oldinfo.infDatabase.wNumRecords;
 43      DWORD dwIndex;
 44       if ( ! iCount)
 45           return ;
 46      
 47      PBYTE pBuff;
 48      WORD wProps;
 49      DWORD dwRecSize;
 50      PCEPROPVAL pRecord;
 51       if (iCount  > 0 )
 52      {
 53           for ( int  i  =   0 ; i  <  iCount;  ++  i)
 54          {
 55               //////////////////////// 移动记录指针
 56              CEoid  =  CeSeekDatabase(hdDB,CEDB_SEEK_BEGINNING,i, & dwIndex);
 57               // ASSERT(CEoid !=0);
 58              pBuff  =   0 ;    
 59               //////////////////////// 读取所有字段值
 60              CEoid  =  CeReadRecordProps(hdDB,CEDB_ALLOWREALLOC, & wProps,NULL, & (LPBYTE)pBuff, & dwRecSize);
 61               // ASSERT(CEoid !=0);
 62              
 63              pRecord  =  (PCEPROPVAL)pBuff;
 64              FILETIME StartTime;
 65              FILETIME EndTime;
 66               int  CallType;
 67              LPWSTR NumType;
 68              LPWSTR AllTime;
 69              LPWSTR Number;
 70               for ( int  i  =   0 ; i  <  wProps;  ++ i)
 71              {
 72                   switch (pRecord -> propid)
 73                  {
 74                   case   0x0006001f  : 
 75                      Number  =  pRecord -> val.lpwstr;
 76                       break ;
 77                   case   0x0007001f :
 78                      AllTime  =  pRecord -> val.lpwstr;
 79                       break ;
 80                   case   0x000a001f :
 81                      NumType  =  pRecord -> val.lpwstr;
 82                       break ;
 83                   case   0x00020040 :
 84                      StartTime  =  pRecord -> val.filetime;
 85                       break ;
 86                   case   0x00030040 :
 87                      EndTime  =  pRecord -> val.filetime;
 88                       break ;
 89                   case   0x00040003 :
 90                      CallType  =  pRecord -> val.lVal;
 91                       break ;
 92                   default :
 93                       break ;
 94                  }
 95                  pRecord  ++ ;
 96              }
 97                          LocalFree(pBuff);
 98          }
 99      }
100       /////////////////////////////////////// //关闭数据库
101       if ( !  CloseHandle(hdDB))
102      {
103 
104           return ;
105      }
106  }
 1  void  DeleteLog( void )
 2  {
 3      CEGUID ceguid;
 4      TCHAR szVolName[ 128 ];
 5      CREATE_INVALIDGUID( & ceguid);
 6       while (::CeEnumDBVolumes( & ceguid,szVolName,MAX_PATH))
 7      {
 8           if (wcsnicmp(L " SystemHeap " ,szVolName, 10 ) == 0 )
 9          {
10               /// //将当前数据库卷定位到SystemHeap上
11               break ;
12          }
13      }    
14      CEOID ceoid;
15      ceoid  =   0 ;
16      
17      CENOTIFYREQUEST  * pRequest  =  (CENOTIFYREQUEST  * ) LocalAlloc(LPTR, sizeof (CENOTIFYREQUEST));
18      pRequest -> dwSize  =   sizeof (CENOTIFYREQUEST);
19      pRequest -> hwnd  =  NULL;
20      pRequest -> hHeap  =  NULL; 
21      pRequest -> dwFlags  =  CEDB_EXNOTIFICATION;
22      
23       /// //打开通话记录数据库,并注册事件
24      HANDLE hdDB;
25      hdDB  =  ::CeOpenDatabaseEx( & ceguid, & ceoid,L " clog.db " , 0 , 0 ,pRequest);
26      
27       if (hdDB  ==  INVALID_HANDLE_VALUE)
28      {
29           return ;
30      }
31      
32       int  iCount;
33      CEOIDINFO    oldinfo;
34      CEOID CEoid  = 0 ;
35       //      PCEGUID pceguid = ceguid;
36       if ( ! CeOidGetInfoEx( & ceguid,ceoid, & oldinfo))
37      {;}
38 
39       // 数据库的记录总数
40      iCount  =  oldinfo.infDatabase.wNumRecords;
41       if ( 0   ==  iCount)
42           return  ;
43      
44      CEOID oid;
45      DWORD dwIndex;
46      oid  =  CeSeekDatabase(hdDB, CEDB_SEEK_BEGINNING,  0 & dwIndex);
47       while (oid)
48      { 
49           //  Update GUI with currently selected record
50           if ( ! CeDeleteRecord(hdDB, oid))
51          {;}
52 
53          oid  =  CeSeekDatabase(hdDB, CEDB_SEEK_CURRENT,  1 & dwIndex);
54      }
55      
56       // 关闭数据库
57       if ( !  CloseHandle(hdDB))
58      {
59           return  ;
60      }
61  }

如果我们只是读取记录,并不编辑,那么通过phone.h来读取通话记录是比较方便的。附上主要代码
TCHAR LastIncomingCall[40];
TCHAR LastMissedCall[40];
TCHAR LastOutGoingCall[40];

TCHAR LastIncomingCallName[256];
TCHAR LastMissedCallName[256];
TCHAR LastOutGoingCallName[256];

HANDLE ph;
CALLLOGENTRY entry;
DWORD count;
entry.cbSize = sizeof(CALLLOGENTRY);
if(PhoneOpenCallLog(&ph)== S_OK)
{
   if(S_OK == PhoneSeekCallLog(ph, CALLLOGSEEK_BEGINNING, 0, &count))

//如果用CALLLOGSEEK_END那么count得到是的全部记录的个数

//如果用CALLLOGSEEK_BEGINNING那么count得是0
   {
    int lastIncallFlag = 0;
    int lastMissedCallFlag = 0;
    int lastOutgoingCallFlag = 0;

    while(PhoneGetCallLogEntry(ph, &entry) == S_OK)
    {
     if(( !lastIncallFlag)&&(entry.iom != IOM_OUTGOING) && (!entry.fOutgoing) )
     {
      //MessageBox(NULL, entry.pszNumber, TEXT("Last Incoming Call"), 0);
      lstrcpy(LastIncomingCall,   entry.pszNumber);
      if(!entry.pszName)
       lstrcpy(LastIncomingCallName,   TEXT("Unknow"));
      else
       lstrcpy(LastIncomingCallName,   entry.pszName);
      MessageBox(NULL,LastIncomingCall,LastIncomingCallName,0);
      lastIncallFlag = 1;
     }
     if(( !lastMissedCallFlag) && (entry.iom == IOM_MISSED))
     {
      lstrcpy(LastMissedCall,   entry.pszNumber);
      if(!entry.pszName)
       lstrcpy(LastMissedCallName,   TEXT("Unknow"));
      else
       lstrcpy(LastMissedCallName,   entry.pszName);
      MessageBox(NULL,LastMissedCall,LastMissedCallName,0);
      lastMissedCallFlag = 1;
     }
     if(( !lastOutgoingCallFlag) && (entry.iom == IOM_OUTGOING))
     {
      lstrcpy(LastOutGoingCall,   entry.pszNumber);
      if(!entry.pszName)
       lstrcpy(LastOutGoingCallName,   TEXT("Unknow"));
      else
       lstrcpy(LastOutGoingCallName,   entry.pszName);
      MessageBox(NULL,LastOutGoingCall,LastOutGoingCallName,0);
      lastOutgoingCallFlag = 1;
     }

     // Make phone
      /* PHONEMAKECALLINFO phonemakecall;
      phonemakecall.cbSize = sizeof(PHONEMAKECALLINFO);
      phonemakecall.dwFlags = PMCF_PROMPTBEFORECALLING;
      phonemakecall.pszDestAddress = entry.pszNumber;
      phonemakecall.pszAppName = NULL;
      phonemakecall.pszCalledParty = NULL;
      phonemakecall.pszComment = NULL;
      PhoneMakeCall(&phonemakecall);*/
    }

    //Show the call log filter
    //PhoneShowCallLog(CALLLOGFILTER_OUTGOING);
   }
}
PhoneCloseCallLog (ph);

打开phone.h发现在WM5.0上有两个两个函数在SDK里是没有的

第一个是

HRESULT PhoneAddSpeedDial(DWORD dwFlags, DWORD* piKey, const TCHAR* pszDisplayName, const TCHAR* pszTelNumber);

第二个是

HRESULT PhoneShowCallLog(CALLLOGFILTER iCallLogFilter);

typedef enum
{
     CALLLOGFILTER_ALL_CALLS,
     CALLLOGFILTER_MISSED,
     CALLLOGFILTER_INCOMING,
     CALLLOGFILTER_OUTGOING
} CALLLOGFILTER;

//++++++
//
//   PhoneAddSpeedDial
//
//        adds a speed dial entry
//
// dwFlags - currently unused, set to 0
//
// piKey - in/out: the key sequence which will invoke the speed dial.
//            currently an entry between 2 and 99 (inclusive) is valid.
//             the API will cause existing entries to be overwritten
//
// pszDisplayName - the non-empty display name for the speed dial
//
// pszTelNumber - the non-empty tel# to be dialed
//

HRESULT PhoneAddSpeedDial(DWORD dwFlags, DWORD* piKey, const TCHAR* pszDisplayName, const TCHAR* pszTelNumber);

 

 

你可能感兴趣的:(WINCE通过clog.db表来读取和删除通话记录)