Why does ICorDebug::SetManagedHandler() return E_NOINTERFACE?
Since I have no energy to type a long post today (sigh), I'll spare you the gory details on the cause of this error. Here are the main reasons why you would be seeing this error -
- While expecting to debug a v2.0.xxxx managed app, you have forgotten to implement ICorDebugManagedCallback2 in your managed callback handler. The managed callback handler must implement both ICorDebugManagedCallback and ICorDebugManagedCallback2 in such cases.
class ManagedEngine : public ICorDebugManagedCallback, public ICorDebugManagedCallback2 { } |
- While implementing QueryInterace(..), you probably forgot to account for ICorDebugManagedCallback2.
HRESULT __stdcall ManagedEngine::QueryInterface(const IID & iid, void** ppv) { if (iid == IID_IUnknown) * ppv = static_cast<ICorDebugManagedCallback*>(this); // original implementation else if (iid == IID_ICorDebugManagedCallback) * ppv = static_cast<ICorDebugManagedCallback*>(this); else if (iid == IID_ICorDebugManagedCallback2) * ppv = static_cast<ICorDebugManagedCallback2*>(this); else { * ppv = NULL; return E_NOINTERFACE; } reinterpret_cast<IUnknown*>(*ppv)->AddRef(); return S_OK; } |