2016-12-06 6 views
0

VC++アプリケーションからOutlookで電子メールを削除しようとしています。私は、Outlookにロードされ、システムに登録されているOutlook Addinを持っています。電子メールの削除をトリガするVC++アプリケーションは、CoCreateInstance()を呼び出して正常に戻ります。VC++アプリケーションからVSTO AddInを使用したOutlook電子メール添付の削除をトリガーする

HRESULT hr; 
IFoo* pISL; 
CoInitialize(NULL); 

LPOLESTR lpoleStr; 
StringFromCLSID(__uuidof(Foo), &lpoleStr); 

hr = CoCreateInstance(
    __uuidof(Foo),   // CLSID of coclass 
    NULL,     // not used - aggregation 
    CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER, // type of server 
    __uuidof(IFoo),   // IID of interface 
    (void**)&pISL);  // Pointer to our interface pointer 

if (SUCCEEDED(hr)) 
{ 
    //fire event 
    BSTR bstr = SysAllocString(params->szObjectPath); 
    pISL->FooMethod(bstr); 
    pISL->Release(); 
    SysFreeString(bstr); 
} 
else 
{ 
    // Couldn't create the COM object. hr holds the error code. 
} 

CoUninitialize(); 

私は、要求されたCOMインターフェイスのメソッドを呼び出すために返されたCOMオブジェクトを使用しています。これらのメソッドは、Outlook Addinが聴くべきイベントを発生させます。

private void RegisterConnectionPoint() 
{ 
    Logger.Log("RegisterConnectionPoint():"); 

    // Call QueryInterface for IConnectionPointContainer 
    Foo foo = new Foo(); 
    IConnectionPointContainer icpc = (IConnectionPointContainer)foo; 

    // Find the connection point for the 
    // _IFoo source interface 
    Guid IID_IFoo = typeof(_IFoo).GUID; 

    icpc.FindConnectionPoint(ref IID_IFoo, out icp); 

    // Pass a pointer of the host to the connection point 
    icp.Advise(this, out cookie); 
} 

私の問題は、Outlook AddinはCOMオブジェクトからのイベントを受信しないということです。私は、COMオブジェクトに正しく登録していないAddinや、VC++アプリ用とOutlook Addin用の2つのCOMオブジェクトがあることが原因と考えられます。

私の質問は

  1. あるが、そのイベントの実行可能な別のプロセスからトリガーされたCOMサーバーからのイベントを受信したときに電子メールを削除見通しVSTOアドインを作成するための基本的な考え方ですか?
  2. 答えが「はい」の場合、最初の質問に誰かが私が間違っていることを見ることができますか?私は生成されたATLコードであるようで、このコードを取得するVC++アプリ側のデバッグ

(私はすべてのコードを書いていないので、時には推測しています):

int cConnections = m_vec.GetSize(); 

for (int iConnection = 0; iConnection < cConnections; iConnection++) 
{ 
    pThis->Lock(); 
    CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection); 
    pThis->Unlock(); 

    IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p); 

    if (pConnection) 
    { 
     CComVariant avarParams[1]; 
     avarParams[0] = attachmentPath; 
     avarParams[0].vt = VT_BSTR; 
     CComVariant varResult; 

     DISPPARAMS params = { avarParams, NULL, 1, 0 }; 
     hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &varResult, NULL, NULL); 
    } 
} 

問題がm_vecです。 GetSize()は0を返します。したがって、接続がないようです。これは、Outlook Addinで使用されているものとは異なるCOMオブジェクトのインスタンスを作成しているか、またはAddinが正しく登録されていないことを意味します。

+0

オブジェクトはin-procで作成されていますか?外部exeで実装されたCOMオブジェクトに接続していますか? –

+0

@DmitryStreblechenko最初のコードサンプルは、私がOutlook Addinと通信できるようにしたいVC++アプリケーションのコードです。つまり、COMオブジェクトが作成されます。それがyurの質問に答えるかどうかわからない:) –

+0

それは私が意味するものではない - COMオブジェクトはどこに実装されているのか? exeまたはaddin? exeによって実装されるシングルトンCOMオブジェクトですか? –

答えて

1

@Dmitryが提供するリンクは私が必要としていたものです。 Running Object Table(ROT)を使用することで、OutlookによってロードされたOutlookアドインへの参照を取得することができました。それで、私はその中のメソッドを呼び出してメールの添付ファイルを削除することができます。デフォルトOutlookAddinクラスは静的コンストラクタを使用していますように、私は、コンストラクタ内のアドインを参照することができませんでした

  1. ThisAddin_Startup(へのアドインの登録を移動する):

    いくつかの変更を含む必要がありました。

  2. この投稿COMException (0x800401E3): Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)) with scheduled taskは、ROTからCOMオブジェクトを取得することはサービスではサポートされていないと説明しているので、自分のコードをユーザーセッションプロセスに移動する必要もありました。これは、私が同じものを試している人々を困惑させる可能性があるので、私が追加しなければならないと思った点でした。

さらに、ROTビューアのツールが見つかりました。http://alax.info/blog/1444は、アドインが実際にROTに登録しているかどうかを確認するのに便利です。

これは人々に役立つことを望みます。

関連する問題