如何创建从另一个派生的两个ATL接口



我有一个带有IDL接口的Dll项目。我想在我的dll中有接口,其中一个可以从另一个派生。我用ATL简单对象向导创建了两个接口。

[
    object,
    uuid(7359AF6C-6E90-4372-991F-556602CB3977),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface IZInterface : IDispatch{
    [id(1)] HRESULT ZGetStr([out,retval] BSTR* str);
    [id(2)] HRESULT GetSize([in,out] LONG* nSize);
};
[
    object,
    uuid(8CA6DBF2-E402-464D-96AE-3D6642D91E14),
    pointer_default(unique)
]
interface IBClass : IUnknown{
    [] HRESULT Method11([out,retval] LONG* l);
};
library DllStandardLib
{
    importlib("stdole2.tlb");
    [
        uuid(491DF659-012F-4C20-90AA-0CBC5BDE5A68)      
    ]
    coclass ZInterface
    {
        [default] interface IZInterface;
    };
        [
        uuid(43CE897F-17F2-4D45-9098-26B7AEE6EC23)      
    ]
    coclass BClass
    {
        [default] interface IBClass;
    };
};

现在,我右键单击类视图中的CZInterface,然后单击Implement Interface IBClass。

但在continer中,这是一个C#项目:

DllStandardLib.ZInterface dd = new DllStandardLib.ZInterface();
dd.Method11();//---> Error: DllStandardLib.ZInterface' does not contain a definition for 'Method11' and no extension method 'Method11' accepting a first argument of type ...

我的项目有什么问题?我希望第二个(派生的)接口知道基本接口的所有方法和属性。请帮帮我!

如果您想实现这一点,最好不要使用对象向导。首先,定义您的接口:

[
    object,
    uuid(7359AF6C-6E90-4372-991F-556602CB3977),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface IZInterface : IDispatch
{
    [id(1)] HRESULT ZGetStr([out,retval] BSTR* str);
    [id(2)] HRESULT GetSize([in,out] LONG* nSize);
};
[
    object,
    uuid(8CA6DBF2-E402-464D-96AE-3D6642D91E14),
    pointer_default(unique)
]
interface IBClass : IZInterface    // IBClass inherits from IZInterface
{
    [id(3)] HRESULT Method11([out,retval] LONG* l);
};

然后定义实现专用接口的类。在你的图书馆里这样做:

library DllStandardLib
{
    importlib("stdole2.tlb");
    [
        uuid(43CE897F-17F2-4D45-9098-26B7AEE6EC23)      
    ]
    coclass BClass
    {
        [default] interface IBClass;
    };
    // NOTE: No need for ZInterface coclass.
};

请注意,IZInterface类并不是真正需要的,除非您希望提供一个单独的实现(=另一个类)。

为了使QueryInterface-调用工作,您还应该将接口添加到COM接口映射中:

class CBClass : 
    // ...
{
    // ...
BEGIN_COM_MAP(CBClass)
    COM_INTERFACE_ENTRY(IBClass)
    COM_INTERFACE_ENTRY(IZInterface)
END_COM_MAP()
    // ...
    // IBClass-Member
    STDMETHOD(Method11)(LONG* l);    // Implement this in your source file (STDMETHODIMP CBClass::Method11(LONG* l) { return E_NOTIMPL; }
}

要从.NET调用IBClass接口成员,必须创建正确类的实例:

DllStandardLib.BClass bc = new DllStandardLib.BClass();
bc.Method11();

最新更新