【发布时间】:2011-07-08 15:49:00
【问题描述】:
我正在更新一个包含自定义 ActiveX 控件的 MFC 应用程序。作为更新的一部分,我有理由向 ActiveX 控件添加新方法,因此它现在具有与旧版本不同的界面。这些更改对原始方法没有影响,因此老客户仍然可以使用新组件。
我一切正常,但我知道我所做的很臭!更新 COM/ActiveX 接口的正确方法是什么。
这个组件是使用 MFC 构建的,除了基本的“使用 MFC 创建 ActiveX 控件”类型的教程之外,谷歌搜索并没有提供太多帮助。我可以找到很多关于 ATL 的资料,但我不想移植该组件。
我从同事那里得到了各种建议,例如更改 guid 和继承界面,但没有确定的。
那么一般来说,更新 COM 接口的最佳实践是什么?
如果您碰巧知道这是如何在 MFC 环境中专门完成的,那也会很有帮助。
我已尝试按照 MSalters 的建议创建第二个界面(见下文),但我不确定我是否正确地进行了操作。我在 odl 文件中创建了一个新接口和一个新的 coclass。这导致 MFC 在客户端应用程序中生成两个单独的包装类,一个派生自 CWnd 用于 coclass Test,一个派生自 COleDispatchDriver 用于 coclass 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;
};
};
【问题讨论】: