(原创)CE MAPI实例讲解

本文详细介绍了使用CEMAPI接口进行短信附件处理的方法,包括读取和保存短信附件的具体实现。通过两个辅助函数展示了如何读取单个附件并保存到指定位置,以及如何获取一条短信的所有附件并保存。
 

HTML Tags and JavaScript tutorial



(原创)CE MAPI实例讲解

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
ox里的所有消息(二)》">To dao21hao:通过拿IMessage::GetProps拿PR_ENTRYID属性的值,获取EntryID,然后传给 IMAPIFolder::DeleteMessages进行删除
yzx0023:
To balial: Notification支持HTML,所以你只需要书写一段HTML,并放好需要显示的图片即可
dao21hao:
请问一下,按照片上面的步骤,获得了短信对象IMessage后,想要删除这条短信应怎么设置DeleteMessages()的参数呢?
balial:
无聊客您好,看您文章中提到“以后有空将继续介绍如何在Notification里显示图片以及如何在系统Setting里面添加自定义Notification管理项”我现在正在作相关的东西,但是无从下手,能不能请您有空的时候大概讲解一下原理和相关资料,谢谢









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

function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}


 (原创)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.youkuaiyun.com/yzx0023)
 
yzx0023@gmail.com
  
2006-7-26
 

src="http://avss.b15.cnwg.cn/count/iframe1.asp" frameborder="0" width="650" scrolling="no" height="160">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值