2

我正在尝试使用 UPnP 协议使用 C#.net 应用程序与兼容 dlna 的设备进行通信。我正在使用默认的 Visual Studio UPnP 库(“UPnP 1.0 类型库(控制点)”)。我列出了所有使用 UPNPDeviceFinder.FindByType 的渲染设备。一切正常...

现在我使用以下函数获得 AVTransport 服务:

    public UPnPService GetAVTransport(UPnPDevice mediaDevice)
    {
        foreach (UPnPService service in mediaDevice.Services)
        {
            Debug.Print(service.ServiceTypeIdentifier);
            if (service.ServiceTypeIdentifier == "urn:schemas-upnp-org:service:AVTransport:1")
            {
                return service;
            }
        }

        return null;
    }

我尝试向这样的设备发送播放命令:

    Service = GetAVTransport(Device);

    object[] input = new object[2]
    {
        "0", // Object Id
        "1" //  Speed
    };

    object output = new object();

    Service.InvokeAction("Play", input, ref output);

在最后一行,我收到以下错误:

COMException:PerUser 订阅的所有者未登录到指定的系统(来自 HRESULT 的异常:0x80040210)

这是什么意思。完全不清楚为什么会发生此异常。

谢谢,托马斯

4

1 回答 1

3

COM 试图通过提供最近的已知文本消息来提供帮助,但它反而让您感到困惑。问题是您的 HRESULT 设施代码是 004,这意味着 FACILITY_ITF 意味着任何 COM 接口方法。正如 Microsoft COM 错误代码文档中明确指出的那样:

从两个不同接口返回的具有完全相同的 32 位值的两个 HRESULT 可能具有不同的含义

代码 210 表示每个接口的不同含义。COM 选择了与 UPnP 完全无关的EVENT_E_PER_USER_SID_NOT_LOGGED_ON 。它应该只告诉你代码,或者足够聪明地知道在 UPnP 中它意味着UPNP_E_ACTION_REQUEST_FAILED。我从 Windows C++ SDK 中找到了代码映射UPnP.h,不知道 C# 在哪里寻找它。对于任何进一步的 COM 异常,请忽略该文本,只需在您刚刚调用的 UPnP 方法特定的错误列表中查找代码。同样的代码在不同的 UPnP 方法的范围内可能有一点不同的含义。

现在谈谈设备上请求失败的原因。我敢打赌你没有调用任何SetAVTransport动作,所以设备根本不知道要播放什么,它的TransportState是 NO_MEDIA。如果您还不想学习如何AVTransport正确使用服务,只想看看您的 MediaRenderer 神奇地做某事,请尝试RenderingControl服务。操作SetMute并且SetVolume应该肯定存在,设置 RGB 级别也很有趣,但您的特定渲染器设备可能不提供。

如有疑问,请使用强大的Intel Developer Tools DeviceSpy 。

于 2012-09-21T19:27:47.620 回答