POOM Contacts 操作

 HRESULT hr;
IPOutlookApp * m_polApp;
if (SUCCEEDED(CoInitializeEx( NULL, 0))) //初始化COM 
{          
// 得到IPOutlookApp对象 
if(SUCCEEDED(CoCreateInstance(CLSID_Application,NULL, CLSCTX_INPROC_SERVER,   IID_IPOutlookApp, reinterpret_cast<void **>(&m_polApp))))
{                   
if(FAILED(m_polApp->Logon(NULL))) {
//建立一次会话                   
If(m_polApp)   
m_polApp->Release();                                                                                     return FALSE; } 
}else              
return FALSE;       }
……………….……………….
If(m_polApp){m_polApp->Logoff();
结束会话m_polApp->Release();
 释放
 m_polApp = NULL;}
 CoUninitialize(); //释放COM                         
                                                       
                                                       
-----------------------------------------------------------------------------
  if(SUCCEEDED(m_polApp->GetDefaultFolder(olFolderContacts, &m_pFolder)))  
  if(SUCCEEDED (m_pFolder->get_Items(&m_pItems)))  
  if(SUCCEEDED (m_pItems->get_Count(&m_ItemCount)))     
  return TRUE; 
  if(FAILED(m_pItems->Item(index,reinterpret_cast<IDispatch **>(&pContact)))) 
  {              return FALSE;       }
-----------------------------------------------------------------------------
例如:
得到姓名: BSTR pbstrbuf = NULL;
pContact->get_FirstName(&pbstrbuf);
pContact->get_MiddleName(&pbstrbuf);
pContact->get_LastName(&pbstrbuf);
得到手机号码:pContact->get_MobileTelephoneNumber(&pbstrbuf);
得到生日:DATE mdatepContact->get_Birthday(&mdate);
在IContact文档里详细罗列了所有方法的内容在这里请不要忘记了对COM字符串pbstrbuf内存的释放,请调用下面函数:SysFreeString(pbstrbuf);
-----------------------------------------------------------------------------
这里我们利用IItem的OpenProperty方法来进行照片的存储
HRESULT     hr          = E_FAIL;
IStream     *pStream    = NULL;
CEPROPID    propid      = PIMPR_PICTURE;
ULONG       cbRead   = 0;  
if(SUCCEEDED(hr = pItem->OpenProperty(propid, GENERIC_READ, &pStream)))
{     hr = pStream->Read(pserial, buflen, &cbRead);   
pStream->Release();}  
if(SUCCEEDED(hr)) 
return cbRead;
相应的写入操作:
if(SUCCEEDED(hr = pItem->OpenProperty(propid, GENERIC_WRITE, &pStream)))   
{hr = pStream->Write(pserial, buflen, &cbWritten);              if(SUCCEEDED(hr))    
{
hr = pStream->Commit(0);                             hr = pItem->Save();}   
pStream->Release();
}}
上述代码中使用了IStream接口来读写数据,在写入后不要忘记调用IStream的Commit方法和IItem的Save方法保存数据。

 

 

调用选择联系人画面

ChooseContact()这个可以吗~
HRESULT   ContactChooserExample()
{
        HRESULT   hr   =   E_FAIL;        
        const   CEPROPID   c_propidAllEmail   =   PIMPR_ALL_EMAIL;  
        CHOOSECONTACT   cc   =   {0};

        //   Setup   the   CHOOSECONTACT   structure.
        cc.cbSize   =   sizeof   (cc);
        cc.dwFlags   =   CCF_RETURNCONTACTNAME   |   CCF_RETURNPROPERTYVALUE   |   CCF_HIDENEW;
        cc.rgpropidRequiredProperties   =   &c_propidAllEmail;  
        //   Number   of   properties   specified   in   the   c_propidAllEmail   array.
        cc.cRequiredProperties   =   1;
        cc.hwndOwner   =   NULL;

        //   Display   the   Contact   Chooser   control   and   prompt   the   user   to   choose   a   contact.
        hr   =   ChooseContact(&cc);        

        //   The   name   and   a   string   representation   of   the   property   is   returned   according   to  
        //   the   flags   set   in   the   CHOOSECONTACT   structure   above.
        DEBUGMSG(TRUE,   (L "%s 's   email   address   is   %s ",  
                cc.bstrContactName,   cc.bstrPropertyValueSelected));

        //   Free   memory.
        SysFreeString(cc.bstrContactName);
        SysFreeString(cc.bstrPropertyValueSelected);

        return   hr;
}

使用IContact   Interface就可以了
IContact::Display()函数就会显示出那个new   contact的界面,
另外可以使用它的put函数预先设置一些栏位,再new。

 

先新加一条记录,然后调用IItem::Edit方法。
IItem接口指针不难得到吧?可从IContact接口查询到。
--------------
IItem::Edit             Displays   the   PIM   item 's   Edit   tab.

 

 

下面是WM5下可以工作的代码:

HRESULT   CreateContact(HWND   hwndParent)
{
        HRESULT   hr                             =   E_FAIL;
        IPOutlookApp   *   pOutApp     =   NULL;
        IDispatch   *pDisp                 =   NULL;
        IItem   *pItem                         =   NULL;
       
        hr   =   InitPOOM2();
        CHR(hr);
        //   Create   a   new   item.
        if   (GetPoomApp(&pOutApp))
        {
                OlItemType   olItemType   =   olContactItem;
                if   (SUCCEEDED(pOutApp-> CreateItem(olItemType,   &pDisp)))
                {
                        //   Get   the   IItem   interface   the   newly   created   item.
                        hr   =   pDisp-> QueryInterface(IID_IItem,   (LPVOID*)&pItem);
                        CHR(hr);
                        //   直接调用Edit方法
                        hr   =   pItem-> Edit(hwndParent);  
                        CHR(hr);
                }
        }        
Error:
        RELEASE_OBJ(pDisp);
        RELEASE_OBJ(pItem);        
        RELEASE_OBJ(pOutApp);        
        UnInitPOOM2();
        return   hr;
}

上述函数InitPOOM2(),UnInitPOOM2(),GetPoomApp()   均可在微软提供的例子里找到。

 

2003版没有IItem接口,那就不能用这个办法了。只能调用IContact::Display()方法了。

void   CreateAnItem(IPOutlookApp   *   polApp)
{
        IContact   *   pContact;
        polApp-> CreateItem(olContactItem,   (IDispatch**)&pContact);

        pContact-> Display();     //   Displays   the   Contact   item 's   Summary   tab

        pContact-> Release();
}

-----------------------------------

./vcx.cpp(318)   :   error   C2065:   'IItem '   :   undeclared   identifier
./vcx.cpp(318)   :   error   C2065:   'pItem '   :   undeclared   identifier
./vcx.cpp(321)   :   error   C3861:   'CHR ':   identifier   not   found
./vcx.cpp(329)   :   error   C2065:   'IID_IItem '   :   undeclared   identifier
./vcx.cpp(330)   :   error   C3861:   'CHR ':   identifier   not   found
./vcx.cpp(332)   :   error   C2227:   left   of   '-> Edit '   must   point   to   class/struct/union/generic   type
                type   is   ' 'unknown-type ' '
./vcx.cpp(333)   :   error   C3861:   'CHR ':   identifier   not   found
./vcx.cpp(337)   :   error   C3861:   'RELEASE_OBJ ':   identifier   not   found
./vcx.cpp(338)   :   error   C3861:   'RELEASE_OBJ ':   identifier   not   found
./vcx.cpp(339)   :   error   C3861:   'RELEASE_OBJ ':   identifier   not   found

运行环境错误,我2003运行的,我后来用你的代码再5.0运行下就少2个宏CHR   RELEASE_OBJ还有就是返回到原程序会变的很慢.

 

-------------------------------

CHR,   RELEASE_OBJ在微软的例子里也有,可能在一个叫Macro.h的文件里。
需要的头文件:   pimstore.h,   参考这里:  
http://msdn2.microsoft.com/EN-US/library/ms859349.aspx

另外,POOM   Sample   Code:    
http://msdn2.microsoft.com/EN-US/library/ms881573.aspx

03版的问题:
需要传入一个IPOutlookApp指针,上面的那个函数(CreateContact)有取得这个指针的方法。
CreateAnItem缺少错误校验,需慎重使用;单步跟踪一下看看问题在哪里。

 

 

从上面的POOM   Sample   Code下载吧。
事实上,如果安装了WM5   SDK,那么POOM   Sample   Code已经在你的硬盘上了。

 

 

#define   CHR(hResult)   /
        if(FAILED(hResult))   {   hr   =   (hResult);   goto   _ErrorLabel;}  

#define   RELEASE_OBJ(s)     /
        if   (s   !=   NULL)             /
        {                                       /
                s-> Release();       /
                s   =   NULL;               /
        }

呵呵,分数好说,重要的是能解决你的问题。

把WM5的那个函数略改造一下就能为03版所用,但是显示不了Edit   tab,只能是Summary   tab。如下:

HRESULT   CreateAndDisplyContact(HWND   hwndParent)
{
        HRESULT   hr                             =   E_FAIL;
        IPOutlookApp   *   pOutApp     =   NULL;
        IDispatch   *pDisp                 =   NULL;
        IContact   *pContact             =   NULL;
       
        hr   =   InitPOOM2();
        CHR(hr);
        //   Create   a   new   item.
        if   (GetPoomApp(&pOutApp))
        {
                OlItemType   olItemType   =   olContactItem;
                if   (SUCCEEDED(pOutApp-> CreateItem(olItemType,   &pDisp)))     //  
                {
                        //   Get   the   IContact   interface   the   newly   created   item.
                        hr   =   pDisp-> QueryInterface(IID_IContact,   (LPVOID*)&pContact);
                        CHR(hr);
                        //   只能调用Display方法,显示   Summary   tab
                        hr   =   pContact-> Display(hwndParent);  
                        CHR(hr);
                }
        }        
Error:
        RELEASE_OBJ(pDisp);
        RELEASE_OBJ(pContact);        
        RELEASE_OBJ(pOutApp);        
        UnInitPOOM2();
        return   hr;
}

上面的代码在得到IContact接口的指针时使用了QueryInterface的方式,也可以直接得到这个指针,参考那个CreateAnItem函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值