Почему модификация IDL вызывает сбой в проектах C ++, но не в проектах VB?

У нас есть проект C ++, который предоставляет некоторые классы через COM Automation и, таким образом, имеет IDL файл.

Всякий раз, когда мы добавляли новые функции к классам в IDL (без изменения UUID), другие проекты C ++, которые используют классы (но не новые функции), должны быть перестроены с новым IDL или они потерпят крах, но другие проекты VB6 ActiveX не потерпят крах.

Почему мы должны перестраивать проекты C ++, но проекты VB в порядке?

1

Решение

По-видимому, вы, вероятно, определяете свои объекты в VB как Objectс, что-то вроде этого:

Dim YourObject as Object
Set YourObject = CreateObject("YourComponent.YourObject")

Если это так, вы заставляете VB проходить через интерфейс автоматизации (IDispatch). По сути, он не знает, какой тип вы собираетесь назначить YourObject до времени выполнения, поэтому он должен вызывать методы этого объекта через IDispatch :: Invoke. Для этого во время выполнения он ищет всю информацию, необходимую для вызова самого объекта.

Напротив, ваш код C ++, вероятно, имеет раннюю привязку, что означает, что смещения в vtable COM-объекта компилируются непосредственно в ваш код. В этом случае, когда / если вы измените код, чтобы эти смещения больше не действовали, код ужасно потерпит неудачу.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]