如何实现给定头文件的接口?

威廉

这可能是一个愚蠢的问题,我犹豫要发布,但是我是ATL的新手。

我需要在代码中实现一个接口。我没有用于接口的TLB或IDL,仅具有一个头文件。

头文件定义接口如下:

EXTERN_C const IID IID_IExternalCon;
 ...    

     MIDL_INTERFACE("BCAC73A8-0226-4250-9D66-9656AA9BB86C")
        IExternalCon: public IUnknown
        {
        public:
            virtual HRESULT STDMETHODCALLTYPE GetName( 
                /* [in] */ __RPC__in ULONG *interface);
           //  ...

        }

而且我需要实现它的多个实例。不幸的是,正在寻找我的界面的加载程序没有找到我对该界面的实现。

我做了这样的事情:

// is this a proper forward reference?
[
    object,
    uuid(BCAC73A8-0226-4250-9D66-9656AA9BB86C), // is this uuid supposed to match the one in the header?
    dual,
    nonextensible,
    pointer_default(unique)
]
interface IExternalCon: IUnknown
{
};


library ... {
    [
        uuid(d543911a-81b0-4de1-9511-d1f14caceed)
    ]

    // the class implementing my interface
    coclass ExternalConTest
    {
        [default] interface IExternalCon;
    };
}

任何有关仅基于头文件实现接口的帮助,提示或指导,将不胜感激。

顺便说一句,我的课定义如下:

class ATL_NO_VTABLE CExternalConTest :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CExternalConTest, &CLSID_ExternalConTest>,
    public IExternalCon
{
public:
...

BEGIN_COM_MAP(CExternalConTest)
    COM_INTERFACE_ENTRY(IExternalCon)
    COM_INTERFACE_ENTRY(IUnknown)
END_COM_MAP()
..
}
西蒙·莫里尔

在ATL对象中实现外部接口所要做的是

  • 将接口添加到已实现接口的列表中(您已经这样做了)。这将修改类的二进制布局(vtable等)
  • 将接口添加到BEGIN_COM_MAP列表。这将指示ATL底层QueryInterface实现对有关该接口ID的查询做出肯定的回答(您已这样做了)。IUnknown这里没有必要。
  • 将接口声明添加到.h文件。链接和注释是可选的,我个人删除了它们。我也总是添加带有接口名称的注释,以便我们知道哪个接口使用哪种方法。当你有很多东西的时候很有用...
  • 将接口实现添加到.cpp文件。

因此,在您的情况下,.h文件将是这样:

class ATL_NO_VTABLE CExternalConTest :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CExternalConTest, &CLSID_ExternalConTest>,
    public IExternalCon // change the class layout
{
public:
...

BEGIN_COM_MAP(CExternalConTest)
    COM_INTERFACE_ENTRY(IExternalCon) // answer to QueryInterface calls
END_COM_MAP()
...

public:
    // IExternalCon
    HRESULT GetName(ULONG *interface);
...
    // IWhatever
    HRESULT Blabla( ... );
    HRESULT Blabla2( ... );

...

这是.cpp文件:

// CExternalConTest
...
// IExternalCon
HRESULT CExternalConTest::GetName(ULONG *interface)
{
    // TODO : implement this
    return S_OK;
}
...
// IWhatever
HRESULT CExternalConTest::Blabla(...)
{
    // TODO : implement this
    return S_OK;
}

HRESULT CExternalConTest::Blabla2(...)
{
    // TODO : implement this
    return S_OK;
}

关于.idl,您无需执行任何操作,因为Visual Studio使用它作为代码生成的基础。通常,在使用Visual Studio时,您首先更改.idl(是否使用向导),然后填补空白。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章