我需要帮助解决添加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;
2条答案
按热度按时间svgewumm1#
确保您的代码没有以提升的权限运行- Outlook是一个单例,因此当您调用
CreateOleObject
(没有理由为Outlook调用GetActiveOleObject
)时,它会返回一个指向已运行示例的指针。如果Outlook和您的代码在不同的安全上下文中运行(例如,一个以“以管理员身份运行”运行),COM系统将拒绝封送调用。6ioyuze22#
当Outlook已在此计算机上打开时,我的代码产生错误。
确保在Windows中在相同的security context下运行应用程序。这意味着如果其中一个应用程序具有管理员权限(提升),则另一个应用程序也应该以管理员权限(
Run As Administrator
)运行。否则,两个应用程序将无法找到对方。另一个因素是,如果系统上已经运行了一个Outlook应用程序示例,则无法在系统上创建新的Outlook应用程序示例。这意味着如果您在不同的安全上下文下运行示例,则无法连接到它或创建新的
Application
示例。