100分求教 关于实现事件观察者的代码,简单有关问题

100分求教 关于实现事件观察者的代码,简单问题。
我较少接触COM编程。 现在有一个COM组件,使用的事件观察者的模式实现。

就是需要我从他提供的一个接口实现派生类,来达到我要处理的代码。 可以看到 接口是从 IDispatch 派生

struct __declspec(uuid("65ac2769-04d9-43d7-b4ea-b20d9d60ab58"))
IDevEventObserver : IDispatch

现在实现类需要从 IDevEventObserver 。 直接派生之后,因为IDevEventObserver是属于抽象类,需要在子类中实现诸如AddRef等方法才能实例化。

不知道我描述是否清楚。 请做过的兄弟给我提个醒,应该怎么做,如何做,多谢多谢。

struct __declspec(uuid("65ac2769-04d9-43d7-b4ea-b20d9d60ab58"))
IDevEventObserver : IDispatch
{
  //
  // Wrapper methods for error-handling
  //

  HRESULT OnAvailableChanged (
  VARIANT_BOOL bIsAvailable );
  HRESULT OnModeChanged (
  enum PhoneMode pm );

  //
  // Raw methods provided by interface
  //

  virtual HRESULT __stdcall raw_OnAvailableChanged (
  VARIANT_BOOL bIsAvailable ) = 0;
  virtual HRESULT __stdcall raw_OnModeChanged (
  enum PhoneMode pm ) = 0;
};

class IMyCls : public IDevEventObserver
{
...
}

另,还有一个问题,就是
 HRESULT SetPhoneEventObserver (
  VARIANT * obs );
接口的方法,obs是事件观察者,应该是一个从接口派生出来的类的实例,我怎么传递参数。


多谢各位兄弟姐妹。

------解决方案--------------------
帮顶一下
------解决方案--------------------
class IMyCls : public IDevEventObserver
{
...
}

这里面OnModeChanged 等实现是看你的逻辑,不难
关键是传Observer的接口指针给 IXXXSubject在 change的方法里调用该OnModeChanged方法

HRESULT SetPhoneEventObserver (
VARIANT * obs );

传递IUnknown或者IDispatch吧
------解决方案--------------------
用ATL,里面有IUnknow的默认实现,继承就行了

传IDispatch比较好

------解决方案--------------------
仔细看看连接点的编程方法,用这个实现起来很简单
------解决方案--------------------
探讨
主函数里面的Call的方法
m_vtDevEventObs.vt = VT_DISPATCH;
m_vtDevEventObs.pdispVal = m_devEventObs.GetIDispatch(FALSE);
m_pDev->SetDeviceEventObserver(&m_vtDevEventObs);

各位帮忙看下,是什么原因。
现在类m_devEventObs,里面的OnAvailableChanged,不会被自动Call

------解决方案--------------------
http://www.vckbase.com/document/viewdoc/?id=1539