@ bugtussle Хотя ваши утверждения верны, утверждения wqw также. Используете ли вы ключевое слово New или CreateObject, на самом деле не имеет ничего общего с ранним или поздним связыванием объекта. Важно то, объявляете ли вы переменную объекта с зарегистрированным типом или нет. Я полагаю, что вы действительно правильно объясняете это в своей статье.
Я хотел бы также упомянуть, что ваша статья написана хорошо и содержит хорошую информацию, но ИМХО содержит также несколько незначительных неточностей. То, что вы называете «двойным интерфейсом» в своей статье (и хорошо объясняете), обычно называется «vTable» или «очень ранним». VB6 поддерживает привязку vTable, где это возможно.
Теперь, как вы сказали, единственное требование к COM-классу - это то, что класс должен реализовывать iUnknown. «Двойной интерфейс» просто означает COM-класс, который реализует как iUnknown, так и iDispatch: COM-класс, который поддерживает позднюю привязку, должен реализовывать последний. VB напрямую не поддерживает COM-объекты, которые не реализуют iDispatch (имея некоторые COM-классы, которые не поддерживают позднюю привязку, а некоторые, которые делают, было бы довольно проблематично в VB); другими словами, VB поддерживает только COM-классы, которые реализуют двойной интерфейс. (Тем не менее, есть приемы, использующие сообщение SendMessage GETOLEINTERFACE, которые обходят требование.)
Кроме того, не совсем то, что iUnknown вообще обойдено, это то, что iUnknown.QueryInterface () обходят, вместо этого переходя непосредственно к виртуальной таблице. Конечно, iUnknown.AddRef () по-прежнему вызывается.
Относительно New против CreateObject: VB имеет стратегию оптимизации для классов, определенных в проекте, которые создаются в этом проекте с использованием ключевого слова New. Однако между ними есть и важные различия, если вы используете класс вне контекста проекта; эта страница http://msdn.microsoft.com/en-us/library/Aa241758 хорошо их обобщает.
Мне также любопытно узнать, какую ошибку получил ОП. :)