delphi 当Outlook打开时,CreateOleObject('Outlook.Application')无法与Outlook365一起工作

5cnsuln7  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(196)

我需要帮助解决添加Outlook任务的代码问题。它在某些系统上运行正常,但在安装了Office 365的计算机上运行不正常。具体来说,当Outlook已在此计算机上打开时,我的代码会产生错误。但是,当Outlook关闭时,代码运行正常。我可以采取哪些步骤来解决此问题?

procedure CreateOutlookReminder(const Subject, Body, Location: string;
  const Start, Duration: TDateTime;
  const ReminderMinutesBeforeStart: Integer);
var
  Outlook, Calendar, AppointmentItem: OleVariant;
begin
  // Connect to Outlook
  try
    try
      Outlook := GetActiveOleObject('Outlook.Application');
    except
      Outlook := CreateOleObject('Outlook.Application');
    end
  Except
    on E: Exception do
    begin
      MessageDlg('Unable to add reminder.' + #13#10 +
        'The version of outlook on your machine is either unsupported or it does not exist.'
        + E.Message, mtError, [mbOK], 0);
      Exit
    end;
  end;
  Calendar := Outlook.GetNamespace('MAPI').GetDefaultFolder(13);
  // olFolderCalendar

  // Create the Task
  AppointmentItem := Calendar.Items.Add; // Task
  AppointmentItem.Subject := Subject;
  AppointmentItem.Body := Body;
  AppointmentItem.remindertime := formatdatetime('mm/dd/yy h:nn:ss ampm',
    Duration);
  AppointmentItem.duedate := Duration;
  // Set the reminder
  AppointmentItem.ReminderSet := True;
  // Save and display the appointment
  AppointmentItem.Save;
  Outlook := unAssigned;
end;
svgewumm

svgewumm1#

确保您的代码没有以提升的权限运行- Outlook是一个单例,因此当您调用CreateOleObject(没有理由为Outlook调用GetActiveOleObject)时,它会返回一个指向已运行示例的指针。如果Outlook和您的代码在不同的安全上下文中运行(例如,一个以“以管理员身份运行”运行),COM系统将拒绝封送调用。

6ioyuze2

6ioyuze22#

当Outlook已在此计算机上打开时,我的代码产生错误。
确保在Windows中在相同的security context下运行应用程序。这意味着如果其中一个应用程序具有管理员权限(提升),则另一个应用程序也应该以管理员权限(Run As Administrator)运行。否则,两个应用程序将无法找到对方。
另一个因素是,如果系统上已经运行了一个Outlook应用程序示例,则无法在系统上创建新的Outlook应用程序示例。这意味着如果您在不同的安全上下文下运行示例,则无法连接到它或创建新的Application示例。

相关问题