CE MAPI实例讲解 --- 设置Message附件(七)

来源:互联网 发布:淘宝不能代付怎么办 编辑:程序博客网 时间:2024/05/17 01:22
 本篇主要介绍如何设置Message的附件内容,下一篇会介绍如何获取附件。长话短说,下面的例子将完成如下的事情:

1)  准备工作,在Temp目录下先放上几张图片,在这个例子里面,我在Temp目录放两张JPG图片,1.jpg,2.jpg,我将把这两张图片放到一个Message里面,生成两个附件。

2)  Outlook草稿箱里面创建出一条新的Message

3)  Message添加附件。

 

如何在Outlook草稿箱里面创建一条新的Message,我想通过前面的文章已经解释清楚了,这里就不罗嗦了,以下假设我们已经获取了IMessage*对象指针。首先提出一个帮助函数:MAPIHelp_AddAttachment,该函数作用是为指定的Message添加指定文件作为附件,定义如下:

       BOOL          MAPIHelp_AddAttachment( IMessage* pMsg, LPCTSTR szFilePath, LPCTSTR szFileName );

       pMsg : Message目标对象指针

     szFilePath : 需要作为附件添加的文件全路径

     szFileName : 需要作为附件添加的文件名称,作为附件的名称

以下是函数具体实现:

     BOOL MAPIHelp_AddAttachment( IMessage* pMsg, LPCTSTR szFilePath, LPCTSTR szFileName )

     {

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

               return FALSE;

 

          BOOL bRet          = FALSE;

          ULONG ulAttachNum  = 0;

          LPATTACH pAttach   = NULL;

          IStream* pStream   = NULL;

          HANDLE hFile       = NULL;

          SPropValue  rgpropsTo[1]  = {0};

          DWORD dwChunkSize  = 4096;

          DWORD dwSizeRead   = 0;

         //预备BUFFER,用来读写文件内容

          LPBYTE pData       = new BYTE[dwChunkSize];

          if( NULL == pData )

              return FALSE;

 

         //创建附件,返回IAttach对象,每个IAttach对象对应于一个附件, ulAttachNum是这个对象的标识,我们可以通过IMessage:: OpenAttach时传入这个ID来读取这个附件,具体的方法会在下篇时介绍。

          if( FAILED(pMsg->CreateAttach( NULL, NULL, &ulAttachNum, &pAttach )) )

              goto Exit;

    

         //设置附件名称

          rgpropsTo[0].ulPropTag      = PR_ATTACH_FILENAME;

          rgpropsTo[0].Value.lpszW    = (LPTSTR)szFileName;

          if( FAILED(pAttach->SetProps(1, rgpropsTo, NULL)) )

              goto Exit;

 

         //通过OpenProperty获取IStream对象,有了IStream对象,我们就可以读写数据。对于IAttach:: OpenProperty,CE上只支持PR_ATTACH_DATA_BIN属性。

          if( FAILED(pAttach->OpenProperty( PR_ATTACH_DATA_BIN, NULL, NULL, MAPI_MODIFY, (LPUNKNOWN *)&pStream )) )

              goto Exit;

 

         //下面部分是文件读写部分,从原始文件里读出数据,再写到附件里面去

          hFile                  = ::CreateFile( szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

          if( INVALID_HANDLE_VALUE == hFile )

              goto Exit;

 

          while( ReadFile( hFile, pData, dwChunkSize, &dwSizeRead, NULL ) )

          {

              if( 0 >= dwSizeRead )

                   break;

              pStream->Write( pData, dwSizeRead, &dwSizeRead );

          }

 

          bRet               = TRUE;

     Exit:

         //完毕以后记的释放获取的对象。

          RELEASE_OBJ(pStream);

          RELEASE_OBJ(pAttach);

          DELETE_OBJ(pData);

          if( INVALID_HANDLE_VALUE != hFile )

              ::CloseHandle( hFile );

          return bRet;

}

 

有了上面的帮助函数,当我们想为一条Message添加附件时,可以按照如下调用:

     MAPIHelp_AddAttachment( pMsg, _T("//Temp//1.jpg"), _T("1.jpg") );

MAPIHelp_AddAttachment( pMsg, _T("//Temp//2.jpg"), _T("2.jpg") );

……

 

 

完毕,惯例,欢迎大家拍砖。

原创粉丝点击