无聊客的专栏

寻找逝去的岁月

陈军ID:yzx0023
48829次访问,排名2146好友6人,关注者31
yzx0023的文章
原创 16 篇
翻译 0 篇
转载 0 篇
评论 363 篇
无聊客的公告
本BLOG所有文章都系作者无聊客原创,请尊重作者辛苦劳动,转载请注明版权出处。
最近评论
hans:每条SMS有唯一标识吗?如何取得?
就像联系人的OID~~~
tony:和你做个友情链接好吗?
影子40524759QQ
壳牌润滑油http://www.ctrhy.com
tony:和你做个友情链接好吗?
影子40524759QQ
壳牌润滑油http://www.ctrhy.com
tony:和你做个友情链接好吗?
影子40524759QQ
壳牌润滑油http://www.ctrhy.com
tony:和你做个友情链接好吗?
影子40524759
美孚润滑油http://www.ctrhy.com
文章分类
收藏
    相册
    me
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 (原创)CE MAPI实例讲解 --- 读取Message附件(八)收藏

    新一篇: Pocket PC & Smartphone 短信图标轻松换(By 无聊客) | 旧一篇: (原创)CE MAPI实例讲解 --- 设置Message附件(七)

        在上一篇里面讲述了如何为一条MESSAGE设置附件,下面将继续关于附件的话题,利用上一个例子,我们接下来来看看如何获取一条MESSAGE的附件信息。下面将通过两个帮助函数来完成:

           BOOL MAPIHelp_SaveAttachFile( LPATTACH pAttach, LPCTSTR szFile )

         作用:读取单个附件文件内容,并保存到指定位置

         pAttach: 附件对象

         szFile: 保存文件名

     

         BOOL MAPIHelp_GetAttachment( IMessage* pMsg, LPCTSTR szFilePath )

         作用:获取一条Message的全部附件,并保存到指定目录下

         pMsg: 目标消息对象

         szFilePath: 目标目录

     

         下面来看看具体实现:

         BOOL MAPIHelp_SaveAttachFile( LPATTACH pAttach, LPCTSTR szFile )

         {

              if( NULL == pAttach || NULL == szFile )

                  return FALSE;

             HANDLE   hFile              = INVALID_HANDLE_VALUE;

              IStream* pstmAttachment     = NULL;

              char *    pBuffer            = NULL; 

              int      i                  = 0;

              DWORD    dwWrite            = 0;

              BOOL     bRet               = FALSE;

              ULONG    ulRead             = 0;

     

             //打开附件,获取IStream对象,用于获取文件内容,根据MSDN的解释,这里只支持PR_ATTACH_DATA_BIN属性。

              if(FAILED(pAttach->OpenProperty (PR_ATTACH_DATA_BIN, NULL, STGM_READ, MAPI_MODIFY,

                                             reinterpret_cast <IUnknown **> (&pstmAttachment))))

              {

                  goto EXIT;

              }   

             //创建目标文件

              hFile = ::CreateFile(szFile, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

             if(INVALID_HANDLE_VALUE == hFile)

              {

                  goto EXIT;

              }   

        

             //缓冲区,用于文件拷贝

              pBuffer  = new char[4096];

              if(NULL == pBuffer)   

              {

                  goto EXIT;

              }

     

             //附件内容拷贝

              while(SUCCEEDED(pstmAttachment->Read(pBuffer, 4096, &ulRead)))

              {

                  if(ulRead <= 0)

                       break;

                  ::WriteFile(hFile, pBuffer, ulRead, &dwWrite, NULL);

              }

             bRet     = TRUE;

         EXIT:

              if(INVALID_HANDLE_VALUE != hFile)

              {

                  ::CloseHandle(hFile);

              }

              if(NULL != pBuffer)

              {

                  delete []pBuffer;

              }

              if(NULL != pstmAttachment)

              {

                  pstmAttachment->Release();

              }

              return bRet;

         }

     

         BOOL MAPIHelp_GetAttachment( IMessage* pMsg, LPCTSTR szFilePath )

         {

              if( NULL == pMsg || NULL == szFilePath )

                  return FALSE;

     

              LPMAPITABLE pAttachTbl      = NULL;     

              SRowSet* psrs               = NULL;

              LPATTACH pAttach            = NULL; 

              LONG     lAttachNum         = 0;

              BOOL     bRet               = FALSE;

        

             //获取附件列表

              if(FAILED(pMsg->GetAttachmentTable(0, &pAttachTbl)))

              {

                  goto EXIT;

              }       

     

             //接下来的查询过程是不是很眼熟?

              while(SUCCEEDED(pAttachTbl->QueryRows (1, 0, &psrs)))

              {

                  //即使查询返回成功,可能记录数也为0,需要排除这种CASE

                  if (NULL == psrs || psrs->cRows != 1)

                  {

                       break;

                  }

                  TCHAR szFile[MAX_PATH];

                  //遍历所有属性,找出附件ID和名称

                  for(int i = 0; i < (int)(psrs->aRow[0].cValues); ++i)

                  {

                       if(PR_ATTACH_NUM == psrs->aRow[0].lpProps[i].ulPropTag)              

                       {

                           //找到附件ID,并打开附件对象        

                            if(FAILED(pMsg->OpenAttach(psrs->aRow[0].lpProps[i].Value.l,

                                                       NULL,

                                                       MAPI_BEST_ACCESS,

                                                       &pAttach)))                

                            {

                                goto EXIT;

                            }  

                            lAttachNum = psrs->aRow[0].lpProps[i].Value.l;

                       }

                       else if(PR_ATTACH_FILENAME == psrs->aRow[0].lpProps[i].ulPropTag)

                       {

                           //获取附件名称,生成保存路径

                            _stprintf( szFile, _T("%s%s"), szFilePath, psrs->aRow[0].lpProps[i].Value.lpszW );

                       }

                  }   

     

                  if(pAttach)

                  {

                       //保存文件

                       MAPIHelp_SaveAttachFile( pAttach, szFile );

                       pAttach->Release();

                       pAttach       = NULL;

                  }

                  FreeProws(psrs);

                  psrs = NULL;

              }

     

              bRet     = TRUE;

     

         EXIT:

              if(NULL != psrs)

              {

                  FreeProws(psrs);

              }

              if(NULL != pAttach)

              {

                  pAttach->Release();

              }

              if(NULL != pAttachTbl)

              {       

                  pAttachTbl->Release();

              }

              return bRet;

         }

     

         外面调用时候很简单,只需要获取IMessage对象,再调用MAPIHelp_GetAttachment即可。

    好了关于附件的内容讲完了,惯例,欢迎大家拍砖。

     

     无聊客(blog.csdn.net\yzx0023)

      yzx0023@gmail.com

       2006-7-26

     

    发表于 @ 2006年07月26日 22:13:00|评论(loading...)|编辑

    新一篇: Pocket PC & Smartphone 短信图标轻松换(By 无聊客) | 旧一篇: (原创)CE MAPI实例讲解 --- 设置Message附件(七)

    评论

    #great_mountain 发表于2006-08-03 18:48:00  IP: 10.193.74.*
    用MAPI发送短消息,怎么才能不让它显示subject,只显示内容,谢谢
    #yzx0023 发表于2006-08-04 17:23:00  IP: 218.108.41.*
    To great_mountain :是指在Inbox List界面里?能否把详细要求说明下,可以发到我Email里面
    #hdw191 发表于2007-01-05 13:12:35  IP: 219.136.128.*
    无聊客你好~

    能请问一下, 在使用MAPI 发送短信时,为何发送英文可以,而发送中文却显示的全是问号呢~  


    楼上 # great_mountain

    你用MAPI写的发送短消息程序, 能正确发送中文不?

    #hhg007 发表于2007-01-06 20:17:07  IP: 202.105.131.*
    收发二进制短信的问题,附上QQ号码510325109,名字 春光灿烂猪八。如果看到请回复,十万火急。我已经没有办法了,谢谢谢谢谢谢
    不好意思,在短消息这儿,看你的文章得到了很大的帮助,先谢谢拉。现在我遇到了一个问题。我现在做一个项目要用手机发二进制短信,及在手机上拦截到该短信。以前我考虑发送用SmsSendMessage,可是我不知道他支不支持二进制短信,而且二进制短信中可不可以传0,因为我们的短信经过了自己的加密处理。短信体中间会有成串的0。收的时候,我通过mapirule可以拦截到所有的短信,可是例程里是转化成LPTSTR,我不知道真么直接得到接收的二进制(需要根据二进制的相应位置判断是否我们的短信息),不好意思如果有时间的话帮我看看,项目非常急,万分感谢

    我看到的发二进制短信都是用手机模块用AT发,我们这个就是PPC手机本身对手机发,接收的时候我用pspvSubject->Value.bin.lpb的内容写入二进制文件都为空,不懂。抽时间帮我看看,实在是没有办法拉,不好意思拉。
    #jinhaijian 发表于2007-01-10 10:12:43  IP: 124.91.6.*
    对于发中文短信,有一个秘密的诀窍。就是短信的内容要申请一段比较长的字符串。我上次试验过。如TCHAR szSubject[5050];如果等于5050,短信会出错,大于5050就可以看到中文了,小于5050中文字符就编程了????号 了。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 无聊客