Теперь есть только один метод QueryInterface, но есть две записи, по одной для каждой таблицы.Помните, что каждая функция в vtable получает соответствующий указатель на интерфейс в качестве параметра this.Это прекрасно для QueryInterface (1);его указатель на интерфейс совпадает с указателем на интерфейс объекта.Но это плохая новость для QueryInterface (2), так как его интерфейсный указатель - q, а не p.
Вот тут-то и поступает корректор.1011 * каждая функция в vtable получает соответствующий указатель на интерфейс в качестве параметра "this""?Это единственный ключ (базовый адрес), используемый методом интерфейса для определения местоположения членов данных в экземпляре объекта?
Обновление
Вот мое последнее понимание:
На самом делеМой вопрос не о назначении параметра this , а о том, почему мы должны использовать соответствующий указатель интерфейса в качестве this параметр.Извините за мою неопределенность.
Помимо использования указателя интерфейса в качестве локатора / точки опоры в макете объекта.Конечно, есть и другие способы сделать это, если вы являетесь разработчиком компонента.
Но это не относится к клиентам нашего компонента.
Когда компонентпостроен в COM, клиенты нашего компонента ничего не знают о внутренностях нашего компонента. Клиенты могут удерживать только указатель интерфейса, и именно этот указатель будет передан в метод интерфейса как этот параметр .При этом ожидании компилятор не имеет другого выбора, кроме как сгенерировать код метода интерфейса на основе этого конкретного этого указателя.
Таким образом, приведенные выше рассуждения приводят к следующему результату:
необходимо убедиться, что каждая функция в vtable должна получить соответствующий указатель интерфейса в виде "Параметр this ".
В случае" блока управления указателем "для одного метода QueryInterface () существуют 2 разные записи, другими словами, 2 разных указателя интерфейсаможет использоваться для вызова метода QueryInterface (), но компилятор генерирует только 1 копию метода QueryInterface ().Таким образом, если один из интерфейсов выбран компилятором в качестве указателя this, нам нужно настроить другой для выбранного.Это то, для чего создан этот блок настроек.
BTW-1, что если компилятор может сгенерировать 2 разных экземпляра метода QueryInterface ()?Каждый основан на соответствующем указателе интерфейса.Для этого не понадобится корректор, но потребуется больше места для хранения дополнительного, но похожего кода.
BTW-2: кажется, что иногда вопрос не имеет разумного объяснения с точки зрения разработчика,но может быть лучше понято с точки зрения пользователя.