Я обновляю приложение MFC, содержащее пользовательский элемент управления ActiveX. В рамках обновления у меня была причина добавить новые методы в элемент управления ActiveX, и теперь он имеет интерфейс, отличный от старой версии. Изменения не повлияли на исходные методы, поэтому старые клиенты все еще могут использовать новый компонент.
У меня все работает, но я знаю, что то, что я сделал, вонючее! Как правильно обновлять интерфейс COM / ActiveX.
Этот компонент был построен с использованием MFC, и Googling не предоставляет большой помощи, кроме базовых учебных пособий типа «Создание элемента управления ActiveX с MFC». Я могу найти множество вещей об ATL, но я не хочу портировать компонент поверх.
У меня были различные предложения от коллег, такие как изменение направляющих и наследование интерфейса, но ничего определенного.
Так что вообще считается лучшей практикой для обновления интерфейсов COM?
И если вам случится знать, как это конкретно делается в среде MFC, это тоже было бы очень полезно.
Я попытался создать второй интерфейс (см. Ниже), как предложено MSalters, но я не уверен, что я сделал это правильно. Я создал новый интерфейс и новый coclass в файле odl. Это приводит к тому, что MFC в клиентском приложении генерирует два отдельных класса-оболочки, один из которых получен из CWnd для тестового класса Coclass, а другой - из COleDispatchDriver для тестового класса Test2 - я бы ожидал два похожих класса-оболочки ....
library TestLib
{
importlib(STDOLE_TLB);
// This is the original interface.......
[ uuid(D2F8E5A8-8A95-463C-814F-B3CF84286223)]
dispinterface _DTest
{
properties:
methods:
[id(1)] short TestMethod();
};
// Class information for CTestCtrl
[ uuid(1DBD2333-2073-4FB6-89AC-E4B200ADED48), control ]
coclass Test
{
[default] dispinterface _DTest;
};
// This is the new interface.
[ uuid(D2F8E5A8-8A95-463C-814F-B3CF84286224)]
dispinterface _DTest2
{
properties:
methods:
[id(1)] short TestMethod();
[id(2)] short TestMethod2();
};
// Class information for CTestCtrl2
[ uuid(1DBD2333-2073-4FB6-89AC-E4B200ADED49), control ]
coclass Test2
{
[default] dispinterface _DTest2;
};
};