在outlook2003的日历中加入一个记录的问题(用ATL)。谢谢
大家好,不知道有没有朋友用ATL做过outlook的开发。
我之前在outlook的联系人类型(olContactItem)的文件夹中加入一个记录没有问题,用同样的方法在日历类中(olAppointmentItem)的文件夹中加入一个记录就有问题了。我采用两种方法都会出现问题:
方法一,(在联系人中是这样方法加进去的,没有问题)
因为我已经知道了要加入的文件夹的folderEntryID和folderStoreID,通过GetFolderFromID可以得到我要的文件夹
MAPIFolder,通过MAPIFolder获得这个文件夹的所有items,然后在items中加入一个olContactItem类型的记录,获得
IDispatch的指针之后,通过quarifyInterface获得ContactItem的指针pContact,通过pContact调用_ContactItem的
成员加入字段,然后调用save(),就可以了。这个在contact是走得通的,在appointmentitem中就是在日历类型的文件夹中行不通,
代码如下:
//获取Outlook应用接口_Application
HRESULT hr;
CComQIPtr <Outlook::_Application> spApp(pIDispatch);
ATLASSERT(spApp);
//获取名字空间
bstr_t bstrName_T (_T("MAPI"));
BSTR bstrName;
bstrName = bstrName_T.copy();
CComPtr <Outlook::_NameSpace> olNs;
hr = spApp->GetNamespace(bstrName,&olNs);
if(hr != S_OK)
{
_tprintf(_T("addItemIntoOutlookCalendarAfterSync: GetNamespace failed.\n"));
return OUTLOOK_BAD_NAMESPACE;
}
//底下的szFolderStoreID和szFolderEntryID是外面传进来的,是已知
BSTR bstrFolderStoreID = _bstr_t(szFolderStoreID);
BSTR bstrFolderEntryID = _bstr_t(szFolderEntryID);
//获取对应id的folder
CComQIPtr<Outlook::MAPIFolder>mapiFolder;
VARIANT varFolderStoreID;
varFolderStoreID.vt = VT_BSTR;
varFolderStoreID.bstrVal = bstrFolderStoreID;
hr = olNs->GetFolderFromID(bstrFolderEntryID, varFolderStoreID, &mapiFolder);
if(hr != S_OK)
{
_tprintf(_T("addItemIntoOutlookCalendarAfterSync: GetFolderFromID failed.\n"));
return OUTLOOK_BAD_GETFOLDER;
}
//打印出folder的名字,调试到这里名字什么的都没错
BSTR bstrFodlerName;
mapiFolder->get_Name(&bstrFodlerName);
_bstr_t b = bstrFodlerName;
char* name = b;
//获得该folder的_Items结构指针
CComQIPtr<Outlook::_Items>folderItems;
hr = mapiFolder->get_Items(&folderItems);
if(hr != S_OK)
{
_tprintf(_T("addItemIntoOutlookCalendarAfterSync: get_Items failed.\n"));
return OUTLOOK_BAD_GETITEM;
}
CComQIPtr<Outlook::_AppointmentItem>pCalendar;
IDispatch *pCalendarIDispatch;
OlItemType defaultType = olAppointmentItem;
VARIANT varType;
varType.vt = VT_I2;
varType.iVal = defaultType;
//在folderItems中加入一个olAppointmentItem类型的成员,想获得对应的IDispatch指针,程序在这里挂掉了
hr = folderItems->Add(varType, &pCalendarIDispatch);//在这里返回的hr都不等于S_OK
if(hr != S_OK)
{
_tprintf(_T("addItemIntoOutlookCalendarAfterSync: Add failed.\n"));
return OUTLOOK_BAD_GETITEM;
}
//方法2,获得folder之后获得对应的_Application指针,然后根据该指针创建olAppointmentItem的记录
代码如下:
//获取Outlook应用接口_Application
HRESULT hr;
CComQIPtr <Outlook::_Application> spApp(pIDispatch);
ATLASSERT(spApp);
//获取名字空间
bstr_t bstrName_T (_T("MAPI"));
BSTR bstrName;
bstrName = bstrName_T.copy();
CComPtr <Outlook::_NameSpace> olNs;
hr = spApp->GetNamespace(bstrName,&olNs);
if(hr != S_OK)
{
_tprintf(_T("addItemIntoOutlookCalendarAfterSync: GetNamespace failed.\n"));
return OUTLOOK_BAD_NAMESPACE;
}
//底下的szFolderStoreID和szFolderEntryID是外面传进来的,是已知
BSTR bstrFolderStoreID = _bstr_t(szFolderStoreID);
BSTR bstrFolderEntryID = _bstr_t(szFolderEntryID);
//获取对应id的folder
CComQIPtr<Outlook::MAPIFolder>mapiFolder;
VARIANT varFolderStoreID;
varFolderStoreID.vt = VT_BSTR;
varFolderStoreID.bstrVal = bstrFolderStoreID;
hr = olNs->GetFolderFromID(bstrFolderEntryID, varFolderStoreID, &mapiFolder);
if(hr != S_OK)
{
_tprintf(_T("addItemIntoOutlookCalendarAfterSync: GetFolderFromID failed.\n"));
return OUTLOOK_BAD_GETFOLDER;
}
//打印出folder的名字,调试到这里名字什么的都没错
BSTR bstrFodlerName;
mapiFolder->get_Name(&bstrFodlerName);
_bstr_t b = bstrFodlerName;
char* name = b;
IDispatch *pCalendarIDispatch;
OlItemType defaultType = olAppointmentItem;
CComQIPtr <Outlook::_Application> folderApp;
hr = mapiFolder->get_Application(&folderApp);
if(hr != S_OK)
{
_tprintf(_T("addItemIntoOutlookCalendarAfterSync: get_Application failed.\n"));
return OUTLOOK_BAD_GETITEM;
}
//在folderApp中加入一个olAppointmentItem类型的成员,想获得对应的IDispatch指针,程序在这里挂掉了
hr = folderApp->CreateItem(defaultType, &pCalendarIDispatch);//返回的hr不等于S_OK
if(hr != S_OK)
{
_tprintf(_T("addItemIntoOutlookCalendarAfterSync: Add failed.\n"));
return OUTLOOK_BAD_GETITEM;
}
我只能想到这两个方法了,不知道有没有朋友知道这个如何解决,谢谢了,比较着急。