3

特殊な CLR プロファイラーを開発する必要があります。ICorProfilerCallbackCLR プロファイラーは、現在 5 までの新しいバージョンを実装する COM サーバーとして実装する必要があります。プロファイラーの初期化は、コールバック メソッドで行われますInitialize(IUnknown* pICorProfilerInfoUnk)QueryInterfaceこれにより、提供されたIUnknownオブジェクトに対して を実行し、インターフェイスへのポインターを取得する機会が与えられICorProfilerInfoます。.NET 4.5 の時点でICorProfilerInfo、 、ICorProfilerInfo2ICorProfilerInfo3、およびがありICorProfilerInfo4、新しいバージョンごとに追加機能が提供されています。理想的には、利用可能な最新バージョンへのポインターを取得し、vtables に実際のオブジェクトが何であるかを把握させたいと考えています。

if (FAILED(pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo4, (LPVOID*)&m_pICorProfilerInfo)))
{
    if (FAILED(pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo3, (LPVOID*)&m_pICorProfilerInfo)))
    {
        if (FAILED(pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo2, (LPVOID*)&m_pICorProfilerInfo)))
        {
            if (FAILED(pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (LPVOID*)&m_pICorProfilerInfo)))
            {
                AtlTrace(TEXT("[Initialize] Failed to retrieve any ICorProfilerInfo~ interface."));
                return S_FALSE;
            }
        }
    }
}

すべての場合において、返されたインターフェイスへのポインターは同じ variablem_pICorProfilerInfoであり、型はCComQIPtr<ICorProfilerInfo>です。次に、メソッドを実装するオブジェクトの実際の型を知らずにメソッドを呼び出します。

これは私に2つの質問を導きます:

  1. COM / ATL コンテキストでは、派生インターフェイスを取得し、上記のような親インターフェイスに格納して、そこから関数を呼び出すことは安全ですか?
  2. 親インターフェイスは、明らかに派生インターフェイスの関数に関する知識を持っていません。ポインターが派生インターフェース ( などICorProfilerInfo2) であるかどうかを確認し、そのようにキャストするにはどうすればよいですか?

これまでのテストでは、#1 は概ね問題ないようです。しかし、確認またはアドバイスを希望します。ポイント#2についてははるかに不確かです。たとえば、ICorProfilerInfohas a SetEnterLeaveFunctionHooksfunction while ICorProfilerInfo2has a SetEnterLeaveFunctionHooks2function. 次の疑似コードのようなことをしたいと思います。

if (m_pICorProfilerInfo IS ICorProfilerInfo2)
{
    ((ICorProfilerInfo2) m_pICorProfilerInfo)->SetEnterLeaveFunctionHooks2(...)
}
else
{
    m_pICorProfilerInfo->SetEnterLeaveFunctionHooks(...)
}

これをどのように達成できるかについてのアドバイスをいただければ幸いです。

4

1 に答える 1