特殊な CLR プロファイラーを開発する必要があります。ICorProfilerCallback
CLR プロファイラーは、現在 5 までの新しいバージョンを実装する COM サーバーとして実装する必要があります。プロファイラーの初期化は、コールバック メソッドで行われますInitialize(IUnknown* pICorProfilerInfoUnk)
。QueryInterface
これにより、提供されたIUnknown
オブジェクトに対して を実行し、インターフェイスへのポインターを取得する機会が与えられICorProfilerInfo
ます。.NET 4.5 の時点でICorProfilerInfo
、 、ICorProfilerInfo2
、ICorProfilerInfo3
、およびがあり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つの質問を導きます:
- COM / ATL コンテキストでは、派生インターフェイスを取得し、上記のような親インターフェイスに格納して、そこから関数を呼び出すことは安全ですか?
- 親インターフェイスは、明らかに派生インターフェイスの関数に関する知識を持っていません。ポインターが派生インターフェース ( など
ICorProfilerInfo2
) であるかどうかを確認し、そのようにキャストするにはどうすればよいですか?
これまでのテストでは、#1 は概ね問題ないようです。しかし、確認またはアドバイスを希望します。ポイント#2についてははるかに不確かです。たとえば、ICorProfilerInfo
has a SetEnterLeaveFunctionHooks
function while ICorProfilerInfo2
has a SetEnterLeaveFunctionHooks2
function. 次の疑似コードのようなことをしたいと思います。
if (m_pICorProfilerInfo IS ICorProfilerInfo2)
{
((ICorProfilerInfo2) m_pICorProfilerInfo)->SetEnterLeaveFunctionHooks2(...)
}
else
{
m_pICorProfilerInfo->SetEnterLeaveFunctionHooks(...)
}
これをどのように達成できるかについてのアドバイスをいただければ幸いです。