将DDiscMaster2Events连接/链接到驱动器更改事件的内容。 Microsoft COM对象

时间:2014-04-22 21:22:40

标签: c++ com mfc mingw

我想在mingw上实现Microsoft的COM对象DDiscMaster2Events以获取磁盘驱动器更改事件。我还没有找到任何这方面的例子。我已经让DDiskFormat2DataEvents工作,所以我希望它与之类似。在DDiskFormat2DataEvents中,我必须将我的DDiskFormat2DataEvents与IDiskFormat2Data连接才能获取事件。这通常使用AfxConnectionAdvise方法完成。我需要什么com对象来连接我的DDiscMaster2Events事件接收器,以接收磁盘更改事件? Visual Studio c ++示例应该回答我的问题。感谢

1 个答案:

答案 0 :(得分:1)

Thottam R. Sriram在本文COM Connection Points中提供了有关如何接收COM事件的一些信息。

根据其内容,这样的一些想法可能适合你:

#include <imapi2.h>
#include <iostream>
#include <cassert>

class DiscMaster2EventsSink : public DDiscMaster2Events {
  public:
    STDMETHOD(NotifyDeviceAdded)(IDispatch *object, BSTR uniqueId)
    {
      std::cout << "NotifyDeviceAdded(...)\n";
      return S_OK;
    }

    STDMETHOD(NotifyDeviceRemoved)(IDispatch *object, BSTR uniqueId)
    {
      std::cout << "NotifyDeviceRemoved(...)\n";
      return S_OK;
    }

  public:
    // The uninteresting stuff follows...

    DiscMaster2EventsSink()
      : m_refCount(1)
    {
    }

    STDMETHOD(QueryInterface)(REFIID riid, void **ppv)
    {
      *ppv = NULL;

      if (riid == IID_IUnknown)
        *ppv = static_cast<void*>(static_cast<IUnknown*>(this));
      else if (riid == IID_IDispatch)
        *ppv = static_cast<void*>(static_cast<IDispatch*>(this));
      else if (riid == __uuidof(DDiscMaster2Events))
        *ppv = static_cast<void*>(static_cast<DDiscMaster2Events*>(this));

      if (*ppv) {
        AddRef();
        return S_OK;
      }

      return E_NOINTERFACE;
    }

    STDMETHOD_(ULONG, AddRef)()
    {
      return InterlockedIncrement(&m_refCount);
    }

    STDMETHOD_(ULONG, Release)()
    {
      ULONG result = InterlockedDecrement(&m_refCount);
      if (result == 0)
        delete this;
      return result;
    }

    STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
    {
      return E_NOTIMPL;
    }

    STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
    {
       return E_NOTIMPL;
    }

    STDMETHOD(GetTypeInfoCount)(UINT *pctinfo)
    {
      *pctinfo = 0;
      return S_OK;
    }

    STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
      VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
    {
      return E_NOTIMPL;
    }

  private:
    ULONG m_refCount;
};

int main()
{
  HRESULT hr;

  hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  assert(SUCCEEDED(hr));

  IDiscMaster2* pDiscMaster2;
  hr = CoCreateInstance(__uuidof(MsftDiscMaster2), NULL, CLSCTX_ALL, __uuidof(IDiscMaster2), (void**)&pDiscMaster2);
  assert(SUCCEEDED(hr));

  IConnectionPointContainer* pCPC;
  hr = pDiscMaster2->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
  assert(SUCCEEDED(hr));

  IConnectionPoint* pCP;
  hr = pCPC->FindConnectionPoint(IID_DDiscMaster2Events, &pCP);
  assert(SUCCEEDED(hr));

  DiscMaster2EventsSink* pSink = new DiscMaster2EventsSink();

  IUnknown* pSinkUnk;
  hr = pSink->QueryInterface(IID_IUnknown, (void**)&pSinkUnk);
  assert(SUCCEEDED(hr));

  DWORD dwAdvise;
  hr = pCP->Advise(pSinkUnk, &dwAdvise);
  assert(SUCCEEDED(hr));

  std::cout << "OK...\n";
  std::cin.get();

  pSinkUnk->Release();
  pSink->Release();
  pCP->Release();
  pCPC->Release();
  pDiscMaster2->Release();
  CoUninitialize();
  return 0;
}

就我所见,它编译并运行正常(S_OK一路),但我看不到任何事件 - 可能是因为我没有外部光驱来制造任何设备添加/删除事件。

(显然,对于一些C ++ COM辅助类,它会更好。)

希望它可能仍然可以帮到你,即使在MinGW下也可能会有一些变化。