2012-05-02 4 views
1

Outlookが閉鎖されているときにプロンプ​​トを表示します。私はすでに自分のアプリケーションで償還を使用しています。私は、Delphiで提供されたTOutlookApplicationクラスを使用したくありません。OutlookApp.Onquitイベントをデルファイで償還して実装し、アプリがビジー状態のときにOutlookを回避するには

DelphiでOutlook Onclose/OnQuitイベントを実装することを親切に助けてください。

OnQuitイベントにTOutlookApplicationのオブジェクトを使用したとき、私のアプリケーションがビジー状態の場合:1分以上かかるSQLステートメントを実行すると、Outlookがハングします。最終的に私はそのハングを避ける必要があります。

私を助けてください。

感謝し、よろしく、 Vijeshナイール

答えて

3

は、いくつかの時間前、私はOutlookのイベントリスナーを実装しました。私はOutlookで動作するためにインポートされたOutlook_tlbライブラリを使用しました。あなたはIConnectionPointインターフェイス経由でOutlook通知を受け取ることができます。イベントリスナクラスは、IDispatchインターフェイス(少なくともInvokeメソッド)を実装する必要があります。 ので、サンプルコードがあります:あなたは、OutlookApplicationのインスタンスを取得する接続ポイントを見つけて、イベントリスナーとして自身を登録する必要があり、コンストラクタコードで

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; 

:として 宣言TOutlookEventListenerは

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を使用してメソッドを使用すると、イベントをフィルタリングできます。 Quitイベントは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(送信者:TObject)イベントも使用しました。

見通しのイベントについては、この記事をお読みください。http://www.codeproject.com/Articles/4230/Implementing-Outlook-2002-XP-Event-Sinks-in-MFC-C

+2

は私だけです:)しかし、まだそれが便利になりかもしれないもの償還Googleで検索しましたので、私の答えは、完全には正しくないようです。 – teran

+0

あなたの答えは完璧です。この質問は償還とは関係ありません:-) –

+0

@DmitryStreblechenko ok :) – teran

関連する問題