【问题标题】:IServiceProvider::QueryService returned E_INVALIDARG in mfcIServiceProvider::QueryService 在 mfc 中返回 E_INVALIDARG
【发布时间】:2015-01-10 10:02:11
【问题描述】:

我正在开发一个小型应用程序。我想嵌入 ActiveX 控件并希望在 mfc 应用程序中远程控制它。因为我需要一个IServiceProvider COM 接口。 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);

}

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

谢谢

【问题讨论】:

    标签: com mfc activex activexobject


    【解决方案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,了解您的课程应该是什么样子。

    【讨论】:

    • 对不起,我刚刚编辑了查询。错误地有一个额外的行代码。它仍然给出错误。你能帮帮我吗?
    • 您仍在尝试(在您的代码 sn-p 中)找到此接口,而您应该实现它并使其可用和可发现。
    • Roman R.,我在放置“QueryService. MSDN says it should be the REFGUID(服务的唯一标识符)”的第一个参数的值时遇到问题。你能说出这是什么吗?
    • 所以我告诉你:你不能通过替换参数来解决它。你要在你这边实现接口,然后WMP会要求你。
    • Roman R.,我是这个话题的新手。你能提供一些我可以知道如何实现这些接口的链接吗?它会帮助我。
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多