Estoy tratando de comprender this example code con respecto a los objetos del navegador.¿Cómo funciona la implementación de múltiples interfaces COM en C++?
En el interior, el autor implementa una única clase que expone múltiples interfaces (IObjectWithSite, IDispatch).
Su función QueryInterface realiza lo siguiente:
if(riid == IID_IUnknown) *ppv = static_cast<BHO*>(this);
else if(riid == IID_IObjectWithSite) *ppv = static_cast<IObjectWithSite*>(this);
else if (riid == IID_IDispatch) *ppv = static_cast<IDispatch*>(this);
He aprendido que desde una perspectiva de C, punteros de interfaz son sólo punteros a vtables. Así que lo interpreto como que C++ es capaz de devolver la VTable de cualquier interfaz implementada usando static_cast.
¿Esto significa que una clase construida de esta manera tiene un montón de VTables en memoria (IObjectWithSite, IDispatch, etc.)? ¿Qué hace C++ con las colisiones de nombres en las diferentes interfaces (cada una tiene una función QueryInterface, AddRef y Release)? ¿Puedo implementar diferentes métodos para cada una de ellas?
Gracias! He hecho algunas lecturas propias y descubrí que no solo crea diferentes VTables, sino que también crea funciones "thunk" para reparar el puntero antes de redirigir a la función común. – Martin