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 であることです。これは、ANY COM インターフェイス メソッドを意味する FACILITY_ITF を意味します。Microsoft COMエラーコードドキュメントで明示的に述べたように:

2 つの異なるインターフェイスから返されたまったく同じ 32 ビット値を持つ 2 つの 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。アクションSetMuteSetVolume確かにあるはずです。RGB レベルの設定も楽しいですが、特定のレンダラー デバイスでは提供されない場合があります。

疑わしい場合は、 Intel Developer Toolsの強力な DeviceSpy を使用してください。

于 2012-09-21T19:27:47.620 に答える