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函数。