2015-03-31 5 views
0

Я пытаюсь получить встречи в тот же день от имени данного пользователя. До сих пор я могу получить мои собственные встречи на сегодня с помощью кода ниже.Получить общедоступные календарные предложения Outlook?

else if (UserSelection == "2") 
      { 
       //Create the Outlook application 
       Outlook.Application oApplication = new Outlook.Application(); 

       // Get the NameSpace and Logon information. 
       Outlook.NameSpace oNameSpace = oApplication.GetNamespace("mapi"); 

       //Log on by using a dialog box to choose the profile. 
       oNameSpace.Logon(Missing.Value, Missing.Value, true, true); 

       // Get the Calendar folder. 
       Outlook.MAPIFolder oCalendar = oNameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar); 

       // Get the appointments (items) collection from the Calendar folder. 
       Outlook.Items oItems = oCalendar.Items; 
       oItems.IncludeRecurrences = true; 


       List<Outlook.AppointmentItem> lst = new List<Outlook.AppointmentItem>(); 

       foreach (Outlook.AppointmentItem item in oItems) 
       { 
        if (item.Start.Day == DateTime.Today.Day && item.Start.Month == DateTime.Today.Month && item.Start.Year == DateTime.Today.Year) 
        { 
         Console.WriteLine("Organizer: " + item.Organizer); 
         Console.WriteLine("Start: " + item.Start.ToString()); 
         Console.WriteLine("End: " + item.End.ToString()); 
         Console.WriteLine("Location: " + item.Location); 
         Console.WriteLine("Recurring: " + item.IsRecurring); 
         Console.WriteLine("Subject: " + item.Subject); 
         Console.WriteLine("Attendees: " + item.OptionalAttendees); 
         Console.WriteLine(""); 
        } 
       } 


       //Get the last appointment(item) 
       //Outlook.AppointmentItem oAppt = (Outlook.AppointmentItem)oItems.GetLast(); 

       //Show the appointment(item) in outlook. 
       //oAppt.Display(true); 

       // Done. Log off. 
       oNameSpace.Logoff(); 

       //Clean up. 
       oItems = null; 
       oCalendar = null; 
       oNameSpace = null; 
       oApplication = null; 

       Console.ReadLine(); 

Это прекрасно работает. Однако следующий ниже код не возвращает заданные пользователем имена пользователя «userName».

if (UserSelection == "1") 
     //try (used for error handling) 
     { 
      string userName = Console.ReadLine(); 


      Outlook.Application oApplication; 
      oApplication = new Outlook.Application(); 
      Outlook.NameSpace oNameSpace = oApplication.GetNamespace("mapi"); 
      oNameSpace.Logon(Missing.Value, Missing.Value, true, true); 

      Outlook.Recipient oRecip = (Outlook.Recipient)oNameSpace.CreateRecipient(userName); 
      Outlook.MAPIFolder oCalendar = (Outlook.MAPIFolder)oNameSpace.GetSharedDefaultFolder(oRecip, Outlook.OlDefaultFolders.olFolderCalendar); 

      // Get the appointments (items) collection from the Calendar folder. 
      Outlook.Items oItems = oCalendar.Items; 
      oItems.IncludeRecurrences = true; 



      List<Outlook.AppointmentItem> lst = new List<Outlook.AppointmentItem>(); 

      foreach (Outlook.AppointmentItem item in oItems) 
      { 
       if (item.Start.Day == DateTime.Today.Day && item.Start.Month == DateTime.Today.Month && item.Start.Year == DateTime.Today.Year) 
       { 
        Console.WriteLine("Organizer: " + item.Organizer); 
        Console.WriteLine("Start: " + item.Start.ToString()); 
        Console.WriteLine("End: " + item.End.ToString()); 
        Console.WriteLine("Location: " + item.Location); 
        Console.WriteLine("Recurring: " + item.IsRecurring); 
        Console.WriteLine("Subject: " + item.Subject); 
        Console.WriteLine("Attendees: " + item.OptionalAttendees); 
        Console.WriteLine(""); 
       } 
      } 



       //Show the appointment(item) in outlook. 
       //oAppt.Display(true); 

       // Done. Log off. 
       oNameSpace.Logoff(); 

       // Clean up. 

       oItems = null; 
       oCalendar = null; 
       oNameSpace = null; 
       oApplication = null; 

       Console.ReadLine(); 

Код линии производства ошибка foreach (Outlook.AppointmentItem item in oItems) Обнаружена ошибка является «Необработанное исключение типа„System.Runtime.InteropServices.COMException“произошло в mscorlib.dll

Дополнительная информация: Исключение из HRESULT : 0x8834010F "

Любая помощь, связанная с этой работой, была бы весьма признательна, спасибо.

+0

сразу ли огонь исключения или только после того, как вы обрабатываете несколько назначений? –

+0

Только после ввода имени пользователя и нажатия на ввод – CheesyMeat

+0

Если я нахожу свое собственное имя, встречаются назначения, но если я нахожу кого-то еще, ошибка возвращается. Возможно, проблема разрешена? У меня есть доступ к общедоступным календарям, поэтому он должен иметь возможность нормально выполнять встречи? – CheesyMeat

ответ

0

Я предлагаю начать с момента выпуска базовых COM-объектов мгновенно. Используйте System.Runtime.InteropServices.Marshal.ReleaseComObject, чтобы освободить объект Outlook, когда вы его закончили. Это особенно важно, если ваша надстройка пытается перечислить более 256 элементов Outlook в коллекции, хранящейся на сервере Microsoft Exchange. Если вы не выпускаете эти объекты своевременно, вы можете достичь предела, налагаемого Биржей, на максимальное количество предметов, открытых в любой момент времени. Затем установите переменную Nothing в Visual Basic (null на C#), чтобы освободить ссылку на объект. См. Systematically Releasing Objects для получения дополнительной информации.

Кроме того, я хотел бы предложить, используя Найти/FindNext или Ограничить методы класса Items. Вы можете прочитать о них в следующих статьях: