ATL 8.0(VS2005) 我要创建一个继承自多个接口的组件类

来源:互联网 发布:ios10软件安装目录 编辑:程序博客网 时间:2024/05/07 08:01

1:假设我们已经比较熟悉COM了(VS2005)

 

问题集合:

 

001:我要创建一个继承自多个接口的组件类

用ATL"添加简单对象向"导->添加类->ATL->ATL简单对象

用Atl向导生成的组件类默认之继承了一个接口类。假设组建类为CMathFt(Math不允许用作自定类名)那么它默认继承和实现的一个接口为IMathFt.如果此时希望另外添加一个接口,比如IAdvancedMath.那么ATL有没有提供向导呢?答案是目前没有提供。但有时候我们需要这么干。有些资料上说这个问题时候,会告诉你如何更改IDL,添加映射等等。

事实上方法映射仍然可以利用ATL的向导(有向导我们似乎更相信向导),具体方法如下:

1:更改IDL文件

毫无办法有些代码还是得手动输入的

在IDL定义完IMath的下面输入如下代码,它们用来描述一个接口

[
 object,
 uuid(D81486DB-8431-4daf-9ED4-0FE3FD280E4B),
 helpstring("IAdvancedMath 接口"),
 pointer_default(unique)
]
interface IAdvancedMath : IUnknown{
 };

修改一处idl代码,红色是添加的部分,其余为原有的

library Chapter3ServerLib
{
 importlib("stdole2.tlb");
 [
  uuid(29C78992-77E2-462B-B615-66A79A091765),
  helpstring("CMathFt Class")
 ]
 coclass CMathFt 
 {
  [default] interface IMathFt;
  interface IAdvancedMath;
 };
 
};

 

2:修改组件类CMath 红色是添加的部分,其余为原有的

class ATL_NO_VTABLE CMathFt :
 public CComObjectRootEx<CComSingleThreadModel>,
 public CComCoClass<CMathFt, &CLSID_Math>,
 public IMathFt,
 public IAdvancedMath
{
public:
 CMathFt()
 {
  }

DECLARE_REGISTRY_RESOURCEID(IDR_MATHFT)

BEGIN_CATEGORY_MAP(CMathFt)
 IMPLEMENTED_CATEGORY(CATID_ATLDevGuide)
END_CATEGORY_MAP()

BEGIN_COM_MAP(CMathFt)
 COM_INTERFACE_ENTRY(IMathFt)
 COM_INTERFACE_ENTRY(IAdvancedMath)
END_COM_MAP()

。。。

};

 

经过如上修改后那么你就可以像添加IMath方法那样去添加IAdvancedMath的方法了

原创粉丝点击