IServiceProvider :: QueryService在mfc中返回E_INVALIDARG

时间:2014-11-13 09:49:55

标签: com mfc activex activexobject

我正在开发一个小应用程序。我想嵌入ActiveX控件,并希望在mfc应用程序中远程控制它。因为我需要一个COM的IServiceProvider接口。 IServiceProvider提供IWMPRemoteMediaAccess接口的访问权限。 为此,我使用这个:

但它每次都会回归E_INVALIDARG。谁能告诉我可能是什么问题。

IOleObject* oleObject;
CComPtr<IServiceProvider>   m_spProvider;
CComPtr<IWMPRemoteMediaServices> m_spServices;

HRESULT hr = CoCreateInstance(__uuidof(WindowsMediaPlayer), 0, CLSCTX_INPROC_SERVER, IID_IOleObject, (void**)&oleObject);

hr = oleObject->QueryInterface(__uuidof(IServiceProvider), (void**)&m_spProvider);
if(SUCCEEDED(hr))
{
//Here It return E_INVALIDARG (hr = E_INVALID_ARG)
hr = m_spProvider->QueryService(__uuidof(IWMPRemoteMediaServices), IID_IServiceProvider,   (void**)&m_spServices);

}

我无法理解哪个论点是错误的。我更确定第一个论点。任何人都可以告诉我它可能是什么。

谢谢

1 个答案:

答案 0 :(得分:1)

IWMPRemoteMediaServices是您应该在您身边实施的界面,而不是通过QueryService进行查询。 MSDN

  

启用远程嵌入

     

要启用Windows Media Player控件的远程嵌入,您的程序必须实现IServiceProvider和IWMPRemoteMediaServices接口。 IServiceProvider是一个标准的组件对象模型(COM)接口,它有一个名为QueryService的方法。 Windows Media Player调用此方法以检索指向IWMPRemoteMediaServices接口的指针。

然后WMP将调用此接口的方法,即您实现的方法。您显示的代码是尝试获取WMP的IServiceProvider和控件实现的服务。反之亦然,这就是WMP将要做的事情 - 它将发现您实施的服务。

请参阅RemoteHost.h and RemoteHost.cpp here,了解您的课程应如何。