システムwiki

C ++ApplicationのOutlook Mapi:名前で連絡先を検索

ddonate 受付中 最終更新日:2020-10-06 20:05

こんにちは、

これが正しいフォーラムかどうかはわかりませんが、正しくない場合は申し訳ありません...

私はOutlookの連絡先を取得するC ++Applicationを持っています:(ローカル&交換)ユーザー&配布リスト)

を使用してインターフェイスファイル 'msoutl.tlh'を取得しました:
#import "C:\Program Files(x86)\common Files\Microsoft shared\Office15\mso.dll" named_guids
#import "c:\Program Files(x86)\Microsoft Office\Office15\MSOUTL.OLB" no_namespace rename( "Folder"、 "OlkFolder")rename( "CopyFile"、 "OlkCopyFile")rename( "GetOrganizer"、 "GetOrganizerAE")
使用できるすべてのOutlook MAPIクラスがあります.
これで、Outlookクライアントからすべての連絡先を取得できます(NULLおよびHRESULTチェックを削除).
_ApplicationPtr pApp;
_NameSpacePtr _nsPtr=pApp->GetNamespace(_bstr_t( "MAPI"));
AddressListsPtrリスト= _nsPtr->GetAddressLists();
AddressListPtrリスト;
char s [256];
for(int i=1; i<=リスト->GetCount(); i ++)
{
リスト=リスト->アイテム(i);
AddressEntries* pAddrEntries=nullptr;
AddressEntryPtr addEntryPtr=pAddrEntries->GetFirst();
while(addEntryPtr)
{
_ExchangeUserPtr pExchangeUser=nullptr;
BSTR bstrPropName=nullptr;
BSTR bstrPropAddr=nullptr;
BSTR bstrSMTPAddr=nullptr;
OlAddressEntryUserType userType;
AddressEntriesPtr pAaddrEntries=nullptr;
addEntryPtr->get_Name(&bstrPropName);
addEntryPtr->get_Address(&bstrPropAddr);
userType=addEntryPtr->GetAddressEntryUserType();
スイッチ(userType)
{
case olExchangeUserAddressEntry://0
{
addEntryPtr->raw_GetExchangeUser(&pExchangeUser);
pExchangeUser->get_PrimarySmtpAddress(&bstrSMTPAddr);
sprintf(s、 "EXCHANGE USER:%S(%S)\n"、(WCHAR*)bstrPropName、(WCHAR*)bstrSMTPAddr);
休憩;
}
case olExchangeDistributionListAddressEntry://1
{
if(S_OK == addEntryPtr->get_Members(&pAaddrEntries))
{
_ExchangeDistributionListPtr exchangeDistrList=nullptr;
addEntryPtr->raw_GetExchangeDistributionList(&exchangeDistrList);
exchangeDistrList->get_PrimarySmtpAddress(&bstrSMTPAddr);
sprintf(s、 "交換分布リスト:%S(%S)-%dメンバー\n"、(WCHAR*)bstrPropName、(WCHAR*)bstrSMTPAddr、pAaddrEntries->GetCount());
}
休憩;
}
case olOutlookContactAddressEntry://10
{
sprintf(s、 "OUTLOOK CONTACT:%S(%S)\n"、(WCHAR*)bstrPropName、(WCHAR*)bstrPropAddr);
休憩;
}
case olOutlookDistributionListAddressEntry://11
{
addEntryPtr->get_Members(&pAaddrEntries);
sprintf(s、 "OUTLOOK配布リスト:%S-%dメンバー\n"、(WCHAR*)bstrPropName、pAaddrEntries->GetCount());
休憩;
}
デフォルト:中断.
}
}
}
これは完全に機能します(Outlookからすべての連絡先を取得しました).
私の問題は、名前を解決して(テキストでフィルタリングする必要があります)、一致するユーザーのみをリストすることです.
すべてのユーザーの読み込みとループを実行できますが、連絡先が多いと本当に遅くなります
そして、FindやRestrictなどの方法があることがわかります.しかし、私は成功していません.
リストを作成したら、次のようにします.
MAPIFolderPtr mapiFolder=list->GetContactsFolder();
if(mapiFolder)
{
_ItemsPtr folderItems=mapiFolder->Items;
if(folderItems)
{
_ItemsPtr pItems;
BSTR bstrPropID=A2BSTR( "*");
HRESULT hr=folderItems->raw_Restrict(bstrPropID、&pItems);//hr =エラー#80020009
}
}
2つの問題があります.
-Outlookローカル連絡先リストでのみ有効なMAPIFolderPtrアイテムを取得します(Exchangeユーザーなどの他のリストはNULLを返します)
-MAPIFolderPtrがあると、mapiFolder->Itemsは有効な値(このリストの連絡先の数)を返しますが、「raw_Restrict」はエラーを返します(#80020009)
私も試しました
folderItems->Restrict( "*")
folderItems->Find(bstrPropID);
両方のケースで例外が発生しました(「条件が無効です」)
そして
IDispatch* pDisp;
folderItems->raw_Find(bstrPropID、&pDisp);
しかし、pDispはNULLです.
Outlook連絡先リストの名前を解決するためのヘルプはありますか?
ディエゴ

返信リスト(回答:2)

1 #
IgorLey
こんにちは、
プログラミングとコードは、特別フォーラム-https://social.msdn.Microsoft.com/Forums/ja-JP/...
このフォーラムはエンドユーザー向けです.申し訳ありません.
応答1# ->にスキップ
2 #
ddonate
すみません、そのフォーラムに移動します