gpt4 book ai didi

delphi - 如何在 delphi 上实现 OutlookApp.Onquit 事件并进行兑换并避免应用程序繁忙时挂起 Outlook

转载 作者:行者123 更新时间:2023-12-02 01:30:16 24 4
gpt4 key购买 nike

我想在 Outlook 关闭时提示用户。我已经在我的申请中使用了兑换。我不想使用Delphi提供的TOutlookApplication类。

请帮我在Delphi上实现Outlook Onclose/OnQuit事件。

当我将 TOutlookApplication 对象用于 OnQuit 事件时,如果我的应用程序正忙于执行以下操作,例如:执行 SQL 语句需要超过 1 分钟,我的 Outlook 就会挂起。最终我需要避免这种挂起。

请帮助我。

感谢和问候,维杰什·奈尔

最佳答案

不久前我实现了 Outlook 事件监听器。我使用导入的 Outlook_tlb 库来处理 Outlook。您可以通过IConnectionPoint接口(interface)接收outlook通知。您的事件监听器类必须实现 IDispatch 接口(interface)(至少 Invoke 方法)。所以,有示例代码:将 TOutlookEventListener 声明为:

TOutlookEventListener = class(TInterfacedObject, IDispatch)
strict private
FConnectionPoint : IConnectionPoint;
FCookie : integer;
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
public
constructor Create();
end;

在构造函数代码中,您必须获取 OutlookApplication 的实例,找到连接点并将其自身注册为事件监听器:

constructor TOutlookEventListener.Create();
var cpc : IConnectionPointContainer;
ol : IDispatch;
begin
inherited Create();

ol := GetActiveOleObject('Outlook.Application');

cpc := ol as IConnectionPointContainer;
cpc.FindConnectionPoint(DIID_ApplicationEvents, FConnectionPoint);
FConnectionPoint.Advise(self, FCookie);
end;

使用Invoke方法您可以过滤事件。 退出 事件的 DispID = 61477

function TOutlookEventListener.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
ArgErr: Pointer): HResult;
begin
result := S_OK;

case DispId of
61442 : ; // ItemSend(const Item: IDispatch; var Cancel: WordBool);
61443 : ; // newMailEventAction();
61444 : ; // Reminder(const Item: IDispatch);
61445 : ; // OptionsPagesAdd(const Pages: PropertyPages);
61446 : ; // Startup;
61447 : begin
FConnectionPoint.Unadvise(FCookie);
FConnectionPoint := nil;

form1.OutlookClosed(self);
end
else
result := E_INVALIDARG;
end;
end;

其他方法必须返回E_NOTIMPL结果。

在表单 OnCreate 事件处理程序中创建 TOutlookEventListener 的实例(假设 Outlook 已在运行)。我还使用 TForm1.OutlookClosed(sender : TObject) 事件来显示通知消息。

阅读这篇有关 Outlook 事件的文章:http://www.codeproject.com/Articles/4230/Implementing-Outlook-2002-XP-Event-Sinks-in-MFC-C

关于delphi - 如何在 delphi 上实现 OutlookApp.Onquit 事件并进行兑换并避免应用程序繁忙时挂起 Outlook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10409749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com