描述:
IDL如下:
===========================================================
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(3D773733-354F-4648-923F-A916C20922E4),
dual,
helpstring("ITest Interface"),
pointer_default(unique)
]
interface ITest : IDispatch
{
[id(1), helpstring("method GetString")] HRESULT GetString([out, retval] BSTR *pVal);
};
[
object,
uuid(78C7DEC7-D05F-47CF-B563-EEE1C963B39F),
helpstring("IMyBase Interface"),
pointer_default(unique)
]
interface IMyBase : IUnknown
{
[id(2),helpstring("method GetBaseString")] HRESULT GetBaseString([out,retval] BSTR *pVal);
};
[
uuid(F3423973-035F-4865-8476-838370ECC7DC),
version(1.0),
helpstring("Inter 1.0 Type Library")
]
library INTERLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(10BABFB1-F7C5-4D58-886A-5F334D68F273),
helpstring("Test Class")
]
coclass Test
{
[default] interface ITest;
interface IMyBase;
};
};
=============================================
Test类实现了IMyBase接口, 其行为从另外一个CMyBase类继承:
====================================
class CMyBase
{
// IMyBase
public:
STDMETHOD(GetBaseString)(BSTR *pVal)
{
*pVal=CComBSTR(L"This is base string!").Detach();
return S_OK;
}
};
class ATL_NO_VTABLE CTest :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CTest, &CLSID_Test>,
public IDispatchImpl<ITest, &IID_ITest, &LIBID_INTERLib>,
public IMyBase,
public CMyBase
{
public:
CTest()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_TEST)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CTest)
COM_INTERFACE_ENTRY(ITest)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IMyBase)
END_COM_MAP()
// ITest
public:
STDMETHOD(GetString)(/*[out, retval]*/ BSTR *pVal);
// IMyBase
STDMETHOD(GetBaseString)(BSTR * pVal)
{
return CMyBase::GetBaseString(pVal);
}
};
=======================================
但在使用Test对象时, 不能使用IMyBase接口的GetBaseString方法,要怎么做才可以?
解决方案1:
COM_INTERFACE_ENTRY_IID(IID_IDispatch,ITest)
解决方案2: “而IMyBase接口又不支持IDispatch”,可以的,但接口映射表要改一改
BEGIN_COM_MAP(CTest)
COM_INTERFACE_ENTRY(ITest)
COM_INTERFACE_ENTRY(IMyBase)
COM_INTERFACE_ENTRY_IID(IDispatch,ITest)
END_COM_MAP()