在outlook2003的日历中加入一个记录的问题(用ATL)。谢谢

fujianzhangzhou 2007-12-13 11:20:21
大家好,不知道有没有朋友用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;
}
我只能想到这两个方法了,不知道有没有朋友知道这个如何解决,谢谢了,比较着急。
...全文
247 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jameshooo 2007-12-17
  • 打赏
  • 举报
回复
up,没做过日历,只做过联系人
emperor_java 2007-12-15
  • 打赏
  • 举报
回复
对了,楼主,你是浙大研究生吧,好像在学校听说过你很牛!
emperor_java 2007-12-15
  • 打赏
  • 举报
回复
Good,牛人.
fujianzhangzhou 2007-12-14
  • 打赏
  • 举报
回复
结贴了,上面的两个方法都可以,原因在于outlook.exe进程在运行的时候不能添加进去,日历类型记录不行,但是联系人类型的记录可以,所以在任务管理器种把outlook.exe关闭了,运行上面的代码就没问题了。也不知道outlook怎么会这样对待日历类型的记录,还有就是上面的GetFolderFromID会出现偶然性失败,尽管传入的id都是正确的,特别是在电脑运行任务比较多的时候。

5,140

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 Office开发/ VBA
社区管理员
  • Office开发/ VBA社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧