第一次用COM,别人的软件中提供了一个sink。
已知如下信息:sink里面两个接口的名称和IID,以及其内部的函数,没有clsid
请问根据这些东西怎样调用里面的函数阿?
最好有个例子,谢谢各位大牛!

解决方案 »

  1.   

    用控件的实例调用QueryInterface,获得sink的指针,然后就可以调用接口函数了
      

  2.   

    我没有用控件,是这样的,对方的程序提供了一个sink及其接口,我们需要获取其中的数据,跟控件没关系阿。
    PS:我用mfc
      

  3.   

    多谢“五岭散人”。这样的,我们在vista的Windows Media Center(WMC)下作开发,需要知道WMC当前的状态。微软的WMC提供了如下COM服务:IMediaStatusSink接口及其iid,IMediaStatusSession接口及其iid,以及接口中中返回状态的函数,并且还知道IMediaStatusSink被注册在这个组里:CATID_MediaStatusSink。我们想用其中的函数来获取WMC的状态,不知道怎样调用。
      

  4.   

    Retrieving Media Status Information
    http://msdn2.microsoft.com/en-us/library/aa468481.aspx
      

  5.   

    分析你的意思,应该是你自己实现IMediaStatusSink接口,由WMC来调用你的实现,正规的连接点用途。
      

  6.   

        
                    //大致应该是这样的
                      //创建WMC
    CComPtr<IMedia> pMedia;
    hr = spSpeaker.CoCreateInstance(__uuidof(IMedia));                //创建接收器
    CComPtr<IMediaStatusSink> pMediaStatusSink;
    hr = spListener.CoCreateInstance(__uuidof(IMediaStatusSink));                //接收WMC的事件
    spListener->ListenTo(EventID, pMedia);
      

  7.   

    不是WMC调用我的,是我要查看WMC的情况。具体内容正如debehe所给的链接,但是上面只给出了可以用哪些函数,函数执行过程,我是菜鸟,不知道该怎样实现。多谢!
      

  8.   

    不知行不行,写了一个WMC的情况的函数STDMETHODIMP GetWMCProperty(MEDIASTATUSTAGARRAY  Tags,MEDIASTATUSPROPARRAY  Properties)
    {
    CoInitialize();
    HRESULT hr=S_OK;
    CComPtr<IMediaStatusSink> pMediaStatusSink;
    hr = pMediaStatusSink.CoCreateInstance(__uuidof(IMediaStatusSink));
    CComPtr<IMediaStatusSession> pMediaStatusSession;
    if(SUCCEEDED(pMediaStatusSink.Initialize()))
    {
    hr=pMediaStatusSink.CreateSession(&pMediaStatusSession);
    if(FAILED(hr))return hr;
    hr =pMediaStatusSession.MediaStatusChange(Tags,Properties);
    }
    CoUninitialize();
    return hr;
    }
      

  9.   

    to yxz_lp:
    多谢帮忙,build的时候说Initialize、CreateSession等函数“is not a member of 'ATL::CComPtr<T>'”,看起来好像是IMediaStatusSink里面的函数不能在pMediaStatusSink中调用阿,是不是需要强制转换呢?还是别的,我不懂COM 望指教。
      

  10.   

    其实上面的都不是正规的连接点的用法.
    class CMainDlg : public CDialogImpl<CMainDlg> ,
    public IDispEventImpl<IDD_CODER,CMainDlg,&DIID__IDemagogueEvents,&LIBID_TESTCONNECTIONLib,1,0>
    {
    public:
    enum { IDD = IDD_MAINDLG }; BEGIN_MSG_MAP_EX(CMainDlg)
    MSG_WM_INITDIALOG(OnInitDialog)
    // MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
    COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
    COMMAND_ID_HANDLER(IDOK, OnOK)
    COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
    END_MSG_MAP()BEGIN_SINK_MAP(CMainDlg)
    SINK_ENTRY_EX(IDD_CODER,DIID__IDemagogueEvents,0x1,OnData)   // 添加连接点的是映射
    END_SINK_MAP() void __stdcall OnData(BSTR bstrTalk);          // 连接点支持的函数.