雷淼森ID:leimiaomiao
4169次访问,排名19608好友1人,关注者3
Wince软件以及驱动开发
leimiaomiao的文章
原创 9 篇
翻译 0 篇
转载 2 篇
评论 23 篇
水木沐的公告
欢迎来访,对于本人原创之文章,如有谬误,敬请指正!请尊重作者成果。
最近评论
习习:问个问题IContact里面要修改Categories怎么做??谢谢
leimiaomiao:wellfrog:
congratulations


leimiaomiao:wellfrog:
congratulations


wellfrog33:cuiyafang212,你是在问leimiaomiao吧?^_^ 我好像没有这个问题。。。让我去查一下,你可以留下邮箱,我会把code发给你
wellfrog33:leimiaomiao, 谢谢回复!后来理解了是用rapi控制手机端安装的dll,读取短消息,实现之后觉得是满简单的。
文章分类
收藏
    相册
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 用MAPI来读取SMS的内容收藏

    新一篇: 获取Contact的具体内容 | 旧一篇: PPC backup程序的概览以及相应技术总结

             在做sms备份的时候,我们首先考虑的是采用mapi的形式将sms的具体内容读出来在还原的时候写回去,事实证明,这种方法是可行但是不可取的!
          这里先看看mapi是怎么读取的,这个过程中参考了无聊客写的东西,并得到我们老员工的指点。
    定义以下两个宏,方便使用:
    #define EXIT_ON_FAILED(_hr)\
     if (FAILED(_hr))\
    {   \
     goto FuncExit; \
    }

    #define RELEASE_OBJ(s)  \
     if (s != NULL)      \
     {                   \
     s->Release();   \
     s = NULL;       \
     }
    初始化mapi :

    HRESULT InitMAPI( )
    {
     CoInitializeEx(NULL, COINIT_MULTITHREADED); 
     MAPIInitialize(NULL);
     // First logon to the store.
     MAPILogonEx(NULL, NULL, NULL, NULL, &m_pSession);

     if( !m_pSession )
      return E_FAIL ;

     return S_OK ;
    }

     // Get the message stores table
     hr = m_pSession->GetMsgStoresTable(MAPI_UNICODE, &pStoresTable);

     // 定义ULONG           ProgColumns[]  =   { 2, PR_ENTRYID, PR_DISPLAY_NAME };来得到属性
     hr = pStoresTable->SetColumns((LPSPropTagArray)&ProgColumns, 0);
     EXIT_ON_FAILED(hr);

     

    以上初始化mapi并获取store以及table!
    下面使用QueryRows方法来获取我们需要的特定的store
    while(SUCCEEDED(pStoresTable->QueryRows(1, 0, &pStoresRows)))
     {
      if (pStoresRows->cRows != 1)
       break;
      else if ((pStoresRows->aRow[0].cValues < 1)
             || (pStoresRows->aRow[0].lpProps[0].ulPropTag != PR_ENTRYID))
       break ;
      else
      {
       if (_tcsicmp(pStoresRows->aRow[0].lpProps[1].Value.lpszW, _T("SMS")) == 0)
    //这里是获取SMS信息的,而其他的还有ActiveSyne、MMS(等等,如果有相应帐户的话...)
       {
        ULONG ulMesageType;
        hr = m_pSession->OpenEntry(pStoresRows->aRow[0].lpProps[0].Value.bin.cb,
         (LPENTRYID)pStoresRows->aRow[0].lpProps[0].Value.bin.lpb,
         NULL,
         NULL,
         &ulMesageType,
         (LPUNKNOWN*)&pSMSStore);
    //得到该store后,后面要用该store来获取IMessage对象
        EXIT_ON_FAILED(hr);
        break;
       }

       FreeProws(pStoresRows);
       pStoresRows = NULL;
      }
     }
     if( pStoresRows )
     {
      FreeProws(pStoresRows);
      pStoresRows = NULL;
     }
     RELEASE_OBJ( pStoresTable );


    释放对象尽早做吧,下面就用得到的SMS store来获取SMS的属性以及其他的SMS的Folder.
    ULONG   ProgColumns_SubTree[]  =   { 1, PR_IPM_SUBTREE_ENTRYID };
     SPropValue * pProgValue_SubFolders = NULL;
     // Get Root Folder
     hr = pSMSStore->GetProps((LPSPropTagArray) ProgColumns_SubTree, MAPI_UNICODE, &ulValues, &pProgValue_SubTree);
     EXIT_ON_FAILED(hr);

     hr = pSMSStore->OpenEntry(pProgValue_SubTree[0].Value.bin.cb, (LPENTRYID)pProgValue_SubTree[0].Value.bin.lpb,
      NULL,
      NULL,
      NULL,
      (LPUNKNOWN*)&pSMSFolder);

     MAPIFreeBuffer(pProgValue_SubTree);

     //has sub folder or not
     hr = pSMSFolder->GetProps((LPSPropTagArray) ProgColumns_SubFolders, MAPI_UNICODE, &ulValues, &pProgValue_SubFolders);

    if( pProgValue_SubFolders[0].Value.b > 0 )
    //判断该foler 下是否有sub folder,有则进一步获取message
    hr = pFolder->GetContentsTable(0, &pContentsTable);
      hr = pContentsTable->SetColumns((LPSPropTagArray)&ProgColumns_Contents, 0);
    //基本同上面,获取Table的方式有变,查错的步骤省略
     hr = pFolder->OpenEntry( pRows->aRow[0].lpProps[0].Value.bin.cb,
          (LPENTRYID)pRows->aRow[0].lpProps[0].Value.bin.lpb,
          NULL,
          MAPI_BEST_ACCESS,
          &ulMesageType,
          (LPUNKNOWN*)&pMessage);
    //得到message,下面便可以对message操作了。
    //SMS中,利用MAPI读出来的分两部分处理,一是联系人部分,另外是内容部分。SMS的内容存放在SUBJECT属性下,而到了OutLook信息中,SUBJECT部分则存放了信息的主题,而内容要采取Istream的方式读取。由于outlook的稍微复杂点,所以下面是写出了outlook的读取方式,存储在自己定义的BackupTemp结构体中
    hr = pMessage->GetProps((LPSPropTagArray) ProgColomns, MAPI_UNICODE, &ulCount, &pProgValue);
      if (SUCCEEDED(hr))
      {       
       if (pProgValue[0].ulPropTag == PR_SENDER_EMAIL_ADDRESS)
        wcscpy( pBackupTemp->bkupHeader.szAddress , pProgValue[0].Value.lpszW);

       if (pProgValue[1].ulPropTag == PR_SUBJECT)
        wcscpy( pBackupTemp->bkupHeader.szSubject , pProgValue[1].Value.lpszW);
       if (pProgValue[2].ulPropTag == PR_MESSAGE_DELIVERY_TIME)
        pBackupTemp->bkupHeader.ftEmailTime =  pProgValue[2].Value.ft;
       MAPIFreeBuffer(pProgValue);
      }


      hr = pMessage->OpenProperty( PR_BODY, &IID_IStream, MAPI_BEST_ACCESS, NULL,
       (LPUNKNOWN*) &pStream);
      if(hr  == S_OK)
      {
       pStream->Read(pBackupTemp->bkupHeader.szBody, 1024*sizeof(WCHAR), &ulNumChars);
      }

     本方法下面读去mail的附件以及mms内容都比较的复杂,而且在还原的时候没办法兼顾所以对象的属性(一个pim联系人的属性就有四十多项),不适合备份!
    接下来我要做的事情又与mapi有关,我会来完善这篇文章并不断地修正
    另外读取pim.vol的办法我也会讲明,不过对于备份来讲,pim文件可以直接拷贝还原,所以就不需要那么麻烦了

     

     


     

    发表于 @ 2007年05月31日 15:16:00|评论(loading...)|编辑

    新一篇: 获取Contact的具体内容 | 旧一篇: PPC backup程序的概览以及相应技术总结

    评论

    #wellfrog33 发表于2008-03-03 14:51:45  IP: 58.247.121.*
    备份是指到PC上吗?刚接触wince,想实现把短消息从ppc备份到pc上,看了无聊客的blog,但是有点不明白,怎么用CeRapiInvoke来调用mapi的函数,看了另一个帖子说要参数封装,从ppc返回的ouput同样也要封装,“智能手机工作室”这样的软件,只在pc端实现了调用,语无伦次,糊涂中。。
    #leimiaomiao 发表于2008-03-24 11:20:46  IP: 58.211.35.*
    wellfrog你好,确实有点语无伦次,用CeRapiInvoke来调用Mapi的函数我也没有做过!我觉得原理是一样的,你先利用MAPI把信件读取出来,弄懂Mapi对数据的控制,然后我想用 Rapi的方式传输到电脑上应该是个比较简单的过程,若想详细的讨论,请邮件给我Oracle_Lei@163.com
    #cuiyafang212 发表于2008-03-25 20:36:14  IP: 219.143.141.*
    wellfrog你好,我调试了下,发现在folder里获取message时,总是多获取一个message,也就是说,如果有4条SMS,但是它第五次SUCCEEDED(pTable->QueryRows(1, 0, &pRows)),是成功的,但是pFolder->OpenEntry出错,但应该是pTable->QueryRows时就返回错误的。怎么控制?
    还有你说“采用mapi的形式将sms的具体内容读出来在还原的时候写回去,事实证明,这种方法是可行但是不可取的”,那应该怎么办呢?
    盼复!
    #wellfrog33 发表于2008-08-04 10:57:50  IP: 10.193.72.*
    leimiaomiao, 谢谢回复!后来理解了是用rapi控制手机端安装的dll,读取短消息,实现之后觉得是满简单的。
    #wellfrog33 发表于2008-08-04 11:00:05  IP: 10.193.72.*
    cuiyafang212,你是在问leimiaomiao吧?^_^ 我好像没有这个问题。。。让我去查一下,你可以留下邮箱,我会把code发给你
    #leimiaomiao 发表于2008-08-04 11:16:57  IP: 124.160.42.*
    wellfrog:
    congratulations


    #leimiaomiao 发表于2008-08-04 11:30:37  IP: 124.160.42.*
    wellfrog:
    congratulations


    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 水木沐