多谢“五岭散人”。这样的,我们在vista的Windows Media Center(WMC)下作开发,需要知道WMC当前的状态。微软的WMC提供了如下COM服务:IMediaStatusSink接口及其iid,IMediaStatusSession接口及其iid,以及接口中中返回状态的函数,并且还知道IMediaStatusSink被注册在这个组里:CATID_MediaStatusSink。我们想用其中的函数来获取WMC的状态,不知道怎样调用。
Retrieving Media Status Information http://msdn2.microsoft.com/en-us/library/aa468481.aspx
to yxz_lp: 多谢帮忙,build的时候说Initialize、CreateSession等函数“is not a member of 'ATL::CComPtr<T>'”,看起来好像是IMediaStatusSink里面的函数不能在pMediaStatusSink中调用阿,是不是需要强制转换呢?还是别的,我不懂COM 望指教。
PS:我用mfc
http://msdn2.microsoft.com/en-us/library/aa468481.aspx
//大致应该是这样的
//创建WMC
CComPtr<IMedia> pMedia;
hr = spSpeaker.CoCreateInstance(__uuidof(IMedia)); //创建接收器
CComPtr<IMediaStatusSink> pMediaStatusSink;
hr = spListener.CoCreateInstance(__uuidof(IMediaStatusSink)); //接收WMC的事件
spListener->ListenTo(EventID, pMedia);
{
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;
}
多谢帮忙,build的时候说Initialize、CreateSession等函数“is not a member of 'ATL::CComPtr<T>'”,看起来好像是IMediaStatusSink里面的函数不能在pMediaStatusSink中调用阿,是不是需要强制转换呢?还是别的,我不懂COM 望指教。
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); // 连接点支持的函数.