0

こんにちは、スタック オーバーフローです。英語が母国語ではないレベルで申し訳ありません。

現在、Visual Studio 2010 で .NET 4.0 を使用して、C# でプロジェクトの UPnP 検出サービスをプログラミングしています。

公式の Microsoft UPnP COM API を使用していますが、UPnP を使用するのはこれが初めてです。私の問題は、ライブラリによって検出されたデバイスのサービスを反復しようとしていて、COM HRESUT:0X80040500 例外がスローされることです。

これが私のコードのサンプルです:

IList<UpnpDevice> result = new List<UpnpDevice>();

UPnPDevices upnpDiscoveryResult = m_UPnPFinder.FindByType(upnpType, 0);

var upnpDiscoveryResultEnumerator = upnpDiscoveryResult.GetEnumerator();

while (upnpDiscoveryResultEnumerator.MoveNext())
{
    var upnpDiscoveryDevice = (IUPnPDevice)upnpDiscoveryResultEnumerator.Current;

    UPnPServices services = upnpDiscoveryDevice.Services;
    var allServices = services.GetEnumerator();

    // ------ Exception is thrown just below
    while (allServices.MoveNext())
    {
        UPnPService service = allServices.Current as UPnPService;
        if (service.Id == "urn:schemas-upnp-org:service:WANIPConnection:1")
        {
        }
        else if (service.Id == "urn:schemas-upnp-org:service:WANPPPConnection:1")
        {
        }
    }

私は何をすべきか迷っています。

私は同じエラーを抱えているかもしれないと思うこれらの人々によると...

…問題は公式のDLLにあるのかもしれないし、新しいものを使ったほうがいいと思うのですが、まずはここで質問したかったのです。このような明らかなバグが実際に API から発生する可能性があるとは、私には奇妙に思えます。

4

1 に答える 1

0

「UpnpDevice」は自分のプロジェクトのクラスであり、後世のために自分の質問に答えます。

    /// <summary>
    /// Converts the native class UPnP device to a generic UPnP device.
    /// </summary>
    /// <param name="nativeDevice">The native device.</param>
    /// <returns>
    /// The converted <see cref="UpnpDevice"/>
    /// </returns>
    private UpnpDevice ConvertNativeUPnPDeviceToGenericUpnpDevice(IUPnPDevice nativeDevice)
    {
        UpnpDevice genericDevice = null;

        if (nativeDevice != null)
        {
            IList<UpnpDevice> genericDeviceChildren = new List<UpnpDevice>();
            IList<String> genericDeviceServices = new List<String>();

            // Converting recursively the children of the native device
            if (nativeDevice.HasChildren)
            {
                foreach (IUPnPDevice nativeDeviceChild in nativeDevice.Children)
                {
                    genericDeviceChildren.Add(ConvertNativeUPnPDeviceToGenericUpnpDevice(nativeDeviceChild));
                }
            }

            try
            {
                // Converting the services, it may break on some modems like old Orange Liveboxes thus the try/catch
                foreach (IUPnPService nativeDeviceService in nativeDevice.Services)
                {
                    genericDeviceServices.Add(nativeDeviceService.ServiceTypeIdentifier);
                }
            }
            catch (Exception exception)
            {
                string msg = this.GetType().Name + " - Method ConvertNativeUPnPDeviceToGenericUpnpDevice - Reading the services threw an exception: " + exception.Message;
                m_Logger.Error(msg);
            }

            genericDevice = new UpnpDevice(nativeDevice.UniqueDeviceName,
            nativeDevice.Description,
            nativeDevice.FriendlyName,
            nativeDevice.HasChildren,
            nativeDevice.IsRootDevice,
            nativeDevice.ManufacturerName,
            nativeDevice.ManufacturerURL,
            nativeDevice.ModelName,
            nativeDevice.ModelNumber,
            nativeDevice.ModelURL,
            nativeDevice.PresentationURL,
            nativeDevice.SerialNumber,
            nativeDevice.Type,
            nativeDevice.UPC,
            genericDeviceServices,
            genericDeviceChildren);
        }

        return genericDevice;
    }

例外的な回答ではありませんが、デバイスからすべてのサービスを取得する唯一の方法でした。一部のデバイスでは眉をひそめて先に進みますが、少なくとも発見全体を壊すことなく、できる限りのことを得るでしょう.

于 2013-09-30T13:49:11.417 に答える