0

次の Code-Block を使用して、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) によって外部で発生するため、try...finally/except ブロックでエラーをキャッチしても機能しませんでした。

フォルダーが存在するかどうかを検出する別の方法は考えられません。エラーの原因となっている行は、パブリックフォルダーを選択してそのプロパティを取得するために不可欠です。

挨拶

4

3 に答える 3

1

なぜtry/exceptが機能しないのですか? Delphi は EOleSysError 例外を問題なくキャッチします。また、例外は Outlook ではなく Delphi RTL によって発生します。すべての IDispatch 対応ライブラリはエラー コードを返します。RTL は、IErrorInfo を使用して説明を要求した後、これを OLE 例外に変換します。

于 2011-10-17T22:38:01.293 に答える
0

このコードブロックは問題なく機能します。解決した別の問題があると思いました。御時間ありがとうございます。

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は彼の答えに非常に正しかったので、私はデバッガーのEOleExceptionを外部のものと間違えました。デバッガーなしでコードを実行しても、try / exceptionブロックによって実際にキャッチされるため、例外は発生しません。

Outlookで複数のアカウントを操作する場合は、MarjanVenemasの回答が役立つ場合があります。

于 2011-10-18T09:00:59.303 に答える
0

メッセージが示すように、Outlook は使用するプロファイルを認識していません。MAPI 名前空間で何かを行う前に、MAPI 名前空間にログオンする必要があります。Exchange サーバーに接続されていないローカルの Outlook インスタンスに接続する場合など、ログオン情報がない場合でも、これを行う必要があります。

FNameSpace := FOutlook.GetNamespace('MAPI');
FNameSpace.Logon('', '', False, False);
Folder := FNameSpace.GetDefaultFolder( olFolderCalendar );
Memo1.Lines.Add( 'Calendar: ' + Folder.Name + ': ' + Folder.Description );
于 2011-10-18T06:20:14.983 に答える