(交換の)パブリックフォルダーがOutlookに存在するかどうかを検出します
-
22-10-2019 - |
質問
次のコードブロックを使用すると、Outlookで設定されたパブリックフォルダーを選択します。
const
olPublicContactsFolder = $00000012; //constant for the public folder
begin
Outlook := CreateOleObject('Outlook.Application');
// Get name space
NameSpace := Outlook.GetNameSpace('MAPI');
// Get root public folder
ContactsRoot := NameSpace.GetDefaultFolder(olPublicContactsFolder); //<-- Error
Contacts:= Contactsroot;
Outlookにパブリックフォルダーがない場合、マークされた行でエラーが発生します(Outlookに設定されていない、Exchange Serverなし)。
問題は、パブリックフォルダーセットがあるかどうかを以前に検出することにより、そのエラーを回避する方法です。
エラーをキャッチします 試してみてください...最終的に/除くブロックが機能しませんでした 例外がMicrosoft API(EoleException)によって外部的に引き起こされるため。
パブリックフォルダーを選択してプロパティを取得する際にエラーを引き起こす行が不可欠であるため、フォルダーが存在するかどうかを検出する別の方法を考えることはできません。
ご挨拶
解決
なぜ仕事をしようとしないのですか? DelphiはEolesySerrorの例外を把握しています。例外は、OutlookではなくDelphi RTLによって提起されます - すべてのIDISPATCHに優しいライブラリはエラーコードを返します。RTLは、IERRORINFOを使用して説明を要求した後、RTLがOLE例外に変換します。
他のヒント
メッセージが示すように、Outlookは使用するプロファイルを知りません。それで何でもできる前に、Mapi名空間にログオンする必要があります。たとえば、Exchangeサーバーに接続されていないローカルOutlookインスタンスに接続する場合、ログオン情報がない場合でもこれを行う必要があります。
FNameSpace := FOutlook.GetNamespace('MAPI');
FNameSpace.Logon('', '', False, False);
Folder := FNameSpace.GetDefaultFolder( olFolderCalendar );
Memo1.Lines.Add( 'Calendar: ' + Folder.Name + ': ' + Folder.Description );
このコードブロックは正常に機能します。私は私が解決した別の問題があると思った。御時間ありがとうございます。
function DoesPublicFolderExist():Boolean;
const
olFolderContacts = $00000012;
var
Outlook, Namespace, ContactsRoot, Contactsfolder : OleVariant;
begin
// Connect to outlook
Outlook := CreateOleObject('Outlook.Application');
// Get name space
NameSpace := Outlook.GetNameSpace('MAPI');
// Get root contacts folder
try
ContactsRoot := NameSpace.GetDefaultFolder(olFolderContacts);
Result:= True;
except
Result:= False;
end;
end;
Dmitry Streblechenkoは彼の答えに非常に正しかったので、私はデバッガーのEolexceptionを外部のものと間違えました。デバッガーなしでコードを実行することは、Try/Exceptionブロックによって実際にキャッチされるため、例外につながりません。
Outlookで複数のアカウントを使用すると、Marjan Venemasの回答が便利かもしれません。