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オブジェクトがあることが原因と考えられます。
私の質問は
- あるが、そのイベントの実行可能な別のプロセスからトリガーされたCOMサーバーからのイベントを受信したときに電子メールを削除見通しVSTOアドインを作成するための基本的な考え方ですか?
- 答えが「はい」の場合、最初の質問に誰かが私が間違っていることを見ることができますか?私は生成された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, ¶ms, &varResult, NULL, NULL);
}
}
問題がm_vecです。 GetSize()は0を返します。したがって、接続がないようです。これは、Outlook Addinで使用されているものとは異なるCOMオブジェクトのインスタンスを作成しているか、またはAddinが正しく登録されていないことを意味します。
オブジェクトはin-procで作成されていますか?外部exeで実装されたCOMオブジェクトに接続していますか? –
@DmitryStreblechenko最初のコードサンプルは、私がOutlook Addinと通信できるようにしたいVC++アプリケーションのコードです。つまり、COMオブジェクトが作成されます。それがyurの質問に答えるかどうかわからない:) –
それは私が意味するものではない - COMオブジェクトはどこに実装されているのか? exeまたはaddin? exeによって実装されるシングルトンCOMオブジェクトですか? –