Я пытаюсь понять this example code относительно объектов-помощников браузера.Как реализовать несколько COM-интерфейсов на C++?
Внутри автор реализует один класс, который предоставляет несколько интерфейсов (IObjectWithSite, IDispatch).
Его функция QueryInterface выполняет следующие операции:
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);
Я узнал, что с точки зрения C, указатели интерфейса являются лишь указатели на виртуальные таблицы. Поэтому я считаю, что C++ способен возвращать VTable любого реализованного интерфейса, используя static_cast.
Означает ли это, что класс, построенный таким образом, имеет кучу VTables в памяти (IObjectWithSite, IDispatch и т. Д.)? Что делает C++ с коллизиями имен на разных интерфейсах (каждый из них имеет функцию QueryInterface, AddRef и Release), могу ли я реализовать различные методы для каждого из них?
Спасибо! Я сделал некоторые чтения самостоятельно, и я обнаружил, что он не только создает разные VTables, но также создает функции «thunk» для исправления указателя перед перенаправлением обратно на общую функцию. – Martin