У нас есть проект C ++, который предоставляет некоторые классы через COM Automation и, таким образом, имеет IDL
файл.
Всякий раз, когда мы добавляли новые функции к классам в IDL
(без изменения UUID), другие проекты C ++, которые используют классы (но не новые функции), должны быть перестроены с новым IDL
или они потерпят крах, но другие проекты VB6 ActiveX не потерпят крах.
Почему мы должны перестраивать проекты C ++, но проекты VB в порядке?
По-видимому, вы, вероятно, определяете свои объекты в VB как Object
с, что-то вроде этого:
Dim YourObject as Object
Set YourObject = CreateObject("YourComponent.YourObject")
Если это так, вы заставляете VB проходить через интерфейс автоматизации (IDispatch). По сути, он не знает, какой тип вы собираетесь назначить YourObject
до времени выполнения, поэтому он должен вызывать методы этого объекта через IDispatch :: Invoke. Для этого во время выполнения он ищет всю информацию, необходимую для вызова самого объекта.
Напротив, ваш код C ++, вероятно, имеет раннюю привязку, что означает, что смещения в vtable COM-объекта компилируются непосредственно в ваш код. В этом случае, когда / если вы измените код, чтобы эти смещения больше не действовали, код ужасно потерпит неудачу.
Других решений пока нет …