ATL inheritance mistake
Hi,
in my project I have to code this situation:
AudioDevice : public IAudioDevice;
CAudioRecorder : public AudioDevice, public IAudioRecorder;
CAudioDecoder : public CAudioRecorder, public IAudioDecoder
The IDL file that represent this situation is:
/////////////////////////////////////////////////////////////////
[
object,
uuid(AB566C6C-AF54-11DE-B5BE-00A0D15E9B20),
oleautomation,
nonextensible,
helpstring("IAudioDevice Interface"),
pointer_default(unique)
]
interface IAudioDevice : IUnknown
{
.....
}
[
object,
uuid(AB566C6E-AF54-11DE-B5BE-00A0D15E9B20),
dual,
oleautomation,
nonextensible,
helpstring("Dual interface for AudioRecorder objects"),
pointer_default(unique)
]
interface IAudioRecorder : IDispatch
{
......
}
[
uuid(AB566C76-AF54-11DE-B5BE-00A0D15E9B20),
dual,
nonextensible,
helpstring("Dual interface for AudioDecoder objects"),
hidden
]
interface IAudioDecoder : IDispatch
{
[propget, id(40), helpstring("Returns a reference to a
IAudioRecorder interface.")]
HRESULT Recorder([out, retval] IAudioRecorder** pVal);
[propget, id(41), helpstring("Returns a reference to a IAudioDevice
interface.")]
HRESULT Device([out, retval] IAudioDevice** pVal);
};
[
uuid(AB566C66-AF54-11DE-B5BE-00A0D15E9B20),
version(1.1),
helpstring("Audio Library")
]
library AxAudioLib4
{
importlib("stdole2.tlb");
[
uuid(AB566C74-AF54-11DE-B5BE-00A0D15E9B20),
helpstring("AudioRecorder Class")
]
coclass AudioRecorder
{
interface IAudioDevice;
//interface IAudioRecorder;
[default] interface IAudioRecorder;
[default, source] dispinterface _IAudioRecorderEvents;
};
//-----------------------------------------------------------------------
[
uuid(AB566C77-AF54-11DE-B5BE-00A0D15E9B20),
helpstring("AudioDecoder Class")
]
coclass AudioDecoder
{
interface IAudioDevice;
interface IAudioRecorder;
[default] interface IAudioDecoder;
[default, source] dispinterface _IAudioDecoderEvents;
};
/////////////////////////////////////////////////////////////////
The AudioDevice class simply implements the IAudioDevice interface (it
is not an ATL derived class).
The CRecorder class ha the following signature:
/////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CAudioRecorder :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAudioRecorder, &CLSID_AudioRecorder>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CAudioRecorder>,
public CProxy_IAudioRecorderEvents<CAudioRecorder>,
public AudioDevice,
public IDispatchImpl<IAudioRecorder, &__uuidof(IAudioRecorder),
&LIBID_AxAudioLib4, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CAudioRecorder();
DECLARE_REGISTRY_RESOURCEID(IDR_AUDIORECORDER)
BEGIN_COM_MAP(CAudioRecorder)
COM_INTERFACE_ENTRY(IAudioDevice)
COM_INTERFACE_ENTRY(IAudioRecorder)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()
/////////////////////////////////////////////////////////////////
Now I have some difficult to define the CAudioDecoder class.
Since It has to implements IAudioDevice and IAudioRecorder I thought
to do something like this:
/////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CAudioDecoder :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAudioDecoder, &CLSID_AudioDecoder>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CAudioDecoder>,
public CProxy_IAudioDecoderEvents<CAudioDecoder>,
public AudioDevice,
public CAudioRecorder,
public IDispatchImpl<IAudioDecoder, &__uuidof(IAudioDecoder),
&LIBID_AxAudioLib4, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CAudioDecoder();
DECLARE_REGISTRY_RESOURCEID(IDR_AUDIODECODER)
BEGIN_COM_MAP(CAudioDecoder)
COM_INTERFACE_ENTRY(IAudioDevice)
COM_INTERFACE_ENTRY(IAudioRecorder)
COM_INTERFACE_ENTRY(IAudioDecoder)
COM_INTERFACE_ENTRY2(IDispatch, IAudioDecoder)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()
/////////////////////////////////////////////////////////////////
But it doesn't works.
Could someone give me some suggestion?
Thanks in advance,
Daniele.