2013-09-23 33 views
0

喜堆棧溢出和對不起我的母語非英語水平的設備的UPNP服務無法重複使用Microsoft UPNP.DLL(C#,Visual Studio 2010中)

目前編程在C#項目UPnP發現服務在Visual Studio 2010上使用.NET 4.0。

我使用官方的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。

回答

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; 
    } 

不是一個異常的答案,但它是我從設備獲取所有服務的唯一途徑。它會在某些設備上皺眉,繼續前進,但至少它會在不破壞整個發現的情況下盡其所能。