2017-09-07 15 views
-1

C++ COMを使用して、既存のExcelアプリケーションのイベントIID_ApplicationEventsをリッスンします。私のコードは別のEXEファイルに置かれます。 接続ポイントは、次のコードで初期化されています。私は、関数invokeを経由して、Excelのイベントを受け付けておりますExcel Automation - FindConnectionPointを使用してCOMイベントをフィルタリングする

IConnectionPointContainer* pCPC = NULL; 
    hr = pEventSource->QueryInterface(IID_IConnectionPointContainer, 
     (void**)&pCPC); 
    if (SUCCEEDED(hr)){ 
     hr = pCPC->FindConnectionPoint(IID_ApplicationEvents, &m_pConnectionPoint); 
     if (SUCCEEDED(hr)){ 
      hr = m_pConnectionPoint->Advise(this, &m_dwConnection); 
      if (FAILED(hr))   
       LOG_ERROR(L"m_pConnectionPoint->Advise - FAIL"); 
     } 
     else 
      LOG_ERROR(L"FindConnectionPoint - IID_ApplicationEvents: FAIL"); 

     pCPC->Release(); 
    } 
    else 
     LOG_ERROR(L"IID_IConnectionPointContainer: FAIL"); 
    return hr; 

STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, 
    WORD wFlags, DISPPARAMS* pDispParams, 
    VARIANT* pVarResult, EXCEPINFO* pExcepInfo, 
    UINT* puArgErr) 

私の質問は以下の通りです:私のアプリのパフォーマンスを改善するために、実行中のExcelの速度を落とさずに、私はOnBeforeSaveイベントとOnCloseイベントのみに興味があります。私のプロセスで他のExcelイベントをフィルタリングする方法はありますか(私のInvoke関数を呼びたくはありません)?

+1

いいえ、方法はありません。接続ポイントに接続すると、その接続ポイントによって発行されたすべてのイベントにサブスクライブします。気にしていないものは無視することができますが、呼び出されるのを避けることはできません。 –

答えて

0

上記のコメントに記載されているように、単にイベントをフィルタリングすることはできません。しかし、あなたはこれを行うために何かを構築することができます。

  • アドインそれはExcelのプロセスにロードされますCOMを作成します。

    は、ここに1つの方法です。 (IDTExtensibility2を参照)。

  • OnConnectionが呼び出されます。
    • は(イベントを発生するイベントやIConnectionPointContainerを処理するためにIDispatchを実装)、独自の自家製のイベント・フィルター・クラスのインスタンスを作成します。
    • OnConnection
    • AddInIstパラメータとして供給AddInオブジェクトの(非公開)ObjectプロパティにそのIUnknownポインタを割り当てることで、「パブリック」というイベント・フィルタ・オブジェクトを作成します。
  • イベントフィルタオブジェクトがイベントを受け取ったら、それをあなたのルールに従ってフィルタリングします。イベントがフィルタ処理されない場合は、フィルタオブジェクトからイベントを発生させます。
  • 外部プロセスでは、AddIns2コレクションにあるCOMアドインを見つけ、そのObjectプロパティを読んでください。その後、Applicationオブジェクトの代わりにイベントソースとして扱うことができます。
関連する問題