【问题标题】:Anyone Seen this (COM) Error Number? (80040214) When Calling .QueryStateVariable from UPnP.dll?有人看到这个(COM)错误号吗? (80040214) 从 UPnP.dll 调用 .QueryStateVariable 时?
【发布时间】:2012-09-01 22:20:39
【问题描述】:

[虽然我在下面使用 VB6,但我很乐意接受 VB.NET 或 C# 中的解决方案,因为我可以用这两种方法编写]

我正在尝试使用函数 QueryStateVariable(),它只接受一个参数(一个描述要检索值的变量的名称的字符串),所以你可以这样运行它:

Dim vReturn As Variant
vReturn = Service.QueryStateVariable("ExternalPort")

服务对象正确设置为 UPnPService (WanIPConnection)。这发生在 WanIPConnection 服务下(直接在 Wan 连接设备下),我只能读取 17 个状态变量中的 4 个(我只是使用“ExternalPort”作为示例变量名)。其他所有变量都会返回此错误号 -2147220972 (80040214),并带有通用的“失败”描述消息:即:

Run-time error '-2147220972 (80040214)':
Method 'QueryStateVariable' of object 'IUPnPService' failed

目前,我只是忽略它(忽略异常)并返回一个空字符串,但如果有人知道这可能意味着什么,甚至只是我可以跟进的线索,那就是一个很大的帮助。也许有人知道这个错误号是什么意思或指的是什么?或者,有没有人看到这个或者正在收到这个错误号或者以前遇到过它?它在 COM 世界中可能具有通用含义,但我无法在 google 上找到它。

如果你在google上搜索-2147220972没有命中,如果你去掉-符号,有几个但都指向不同的含义,如果你把单词upnp放在它旁边你得到0命中!现在,如果您搜索“80040214 upnp”(当然不带引号),您会得到 8 次点击,这几乎完全是用户在使用支持 UPnP 的软件并复制/粘贴他们的错误日志时遇到错误。不是程序员报告错误号并寻求帮助并获得解决方案或答案(本来会很棒)。

更新:我已经找到了这个错误代码的定义,但仍然没有接近解决它,因为描述非常笼统,并没有为我提供如何去的任何线索关于解决它,但为了您的信息,这里是(也许对你们中的某些人更有意义):

UPNP_E_DEVICE_ERROR 的定义:

“变量未发生事件,远程查询返回错误代码。这不是传输错误;设备收到请求,但返回错误”。

.

.

*下面写的附加文字不是解释这个问题的必要阅读,但包括那些对附加信息感兴趣的人:*

我已经从我的程序中生成了一个日志作为输出,因此我可以将 17 个变量中的每一个的结果(并尝试获取它们的值)粘贴到 StackOverflow 中。回顾一下,WanIPConnection 服务有 17 个变量,所以我已经尝试并记录了所有变量(只有 4 次成功尝试,其余是运行时错误)和 WanPPPConnection 服务(与 WanIPConnection 服务非常相似)但总共有19 个状态变量(仅比 WanIPConnection 多 2 个)。我已经尝试(并记录了)所有 19 次变量检索尝试,并且只收到了 4 次成功的值返回(所有其他都以运行时错误结束) - 所以,我从 WanIPConnection 和 WanPPPConnection 获得了 4 次成功。

这是我的日志,我的真实 IP 地址已更改(因为我知道如果我不大声笑,我会被激怒),并且当前设置的设备和服务在两个日志中的每一个的开头都说明(显示) ,这里是:

[注意避免混淆:我在检索到的值周围放置星号 () 以可视化空格,有时 StackOverflow 会将内容转换为斜体,或者如果中间的字符串为空,则将星号留在原处]*

第一个日志(WanIPConnection,17 个状态变量):

将uDevice(当前设置的设备)设置为:WAN Connection Device、NETGEAR WNR1000v3 N150 无线路由器, urn:schemas-upnp-org:device:WANConnectionDevice:1

设置uService(当前设置服务)为: urn:schemas-upnp-org:service:WANIPConnection:1

在 1 次(共 1 次)尝试中完成 GetQSV(用于 ConnectionStatus)。 QSV 的长度 为 9(高于 0)。返回值为已连接(非空)。

在 1 次(共 1 次)尝试中完成 GetQSV(用于 ConnectionType)。 QSV 的长度 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 ExternalIPAddress)。的长度 QSV 为 13(高于 0)。返回值为110.122.16.83(非空)。

在 1 次(共 1 次)尝试中完成 GetQSV(用于 ExternalPort)。 QSV 的长度为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 InternalClient)。 QSV 的长度 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 InternalPort)。 QSV 的长度为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(针对 LastConnectionError)。的长度 QSV 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 (of 1) 次尝试中完成 GetQSV(用于 NATEnabled)。 QSV的长度为0 (长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 (of 1) 次尝试中完成 GetQSV(用于 PortMappingDescription)。长度 QSV 的值为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 (of 1) 次尝试中完成 GetQSV(用于 PortMappingEnabled)。的长度 QSV 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 PortMappingLeaseDuration)。 QSV 的长度为 0(长度检查失败)。返回值为**(不是 空值)。 [-2147220972] 对象的方法“QueryStateVariable” 'IUPnPService' 失败 LastDllError: 0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 PortMappingNumberOfEntries)。 QSV 的长度为 1(大于 0)。返回值为2(非空)。

在 1 次(共 1 次)尝试中完成 GetQSV(用于 PortMappingProtocol)。的长度 QSV 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(对于可能的连接类型)。长度 QSV 的值为 9(高于 0)。返回值为 *IP_Routed* (Not Null)。

在 1 次(共 1 次)尝试中完成 GetQSV(用于 RemoteHost)。 QSV的长度为0 (长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 RSIPAvailable)。 QSV 的长度为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 (of 1) 次尝试中完成 GetQSV(用于正常运行时间)。 QSV的长度为0 (长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

第二个日志(WanPPPConnection,19 个状态变量):

将uDevice(当前设置的设备)设置为:WAN Connection Device、NETGEAR WNR1000v3 N150 无线路由器, urn:schemas-upnp-org:device:WANConnectionDevice:1

设置uService(当前设置服务)为: urn:schemas-upnp-org:service:WANPPPConnection:1

在 1 (of 1) 次尝试中完成 GetQSV(用于 DownstreamMaxBitRate)。的长度 QSV 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(针对 UpstreamMaxBitRate)。的长度 QSV 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 ConnectionStatus)。 QSV 的长度 为 9(高于 0)。返回值为已连接(非空)。

在 1 次(共 1 次)尝试中完成 GetQSV(用于 ConnectionType)。 QSV 的长度 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 ExternalIPAddress)。的长度 QSV 为 13(高于 0)。返回值为110.122.16.83(非空)。

在 1 次(共 1 次)尝试中完成 GetQSV(用于 ExternalPort)。 QSV 的长度为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 InternalClient)。 QSV 的长度 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 InternalPort)。 QSV 的长度为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(针对 LastConnectionError)。的长度 QSV 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 (of 1) 次尝试中完成 GetQSV(用于 NATEnabled)。 QSV的长度为0 (长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 (of 1) 次尝试中完成 GetQSV(用于 PortMappingDescription)。长度 QSV 的值为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 (of 1) 次尝试中完成 GetQSV(用于 PortMappingEnabled)。的长度 QSV 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 PortMappingLeaseDuration)。 QSV 的长度为 0(长度检查失败)。返回值为**(不是 空值)。 [-2147220972] 对象的方法“QueryStateVariable” 'IUPnPService' 失败 LastDllError: 0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 PortMappingNumberOfEntries)。 QSV 的长度为 1(大于 0)。返回值为2(非空)。

在 1 次(共 1 次)尝试中完成 GetQSV(用于 PortMappingProtocol)。的长度 QSV 为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(对于可能的连接类型)。长度 QSV 的值为 9(高于 0)。返回值为 *IP_Routed* (Not Null)。

在 1 次(共 1 次)尝试中完成 GetQSV(用于 RemoteHost)。 QSV的长度为0 (长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 次(共 1 次)尝试中完成 GetQSV(用于 RSIPAvailable)。 QSV 的长度为 0(长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

在 1 (of 1) 次尝试中完成 GetQSV(用于正常运行时间)。 QSV的长度为0 (长度检查失败)。返回值为**(非空)。 [-2147220972] 对象“IUPnPService”的方法“QueryStateVariable” LastDllError 失败:0

【问题讨论】:

  • 首先,解码 HRESULT en.m.wikipedia.org/wiki/HRESULT
  • 这里是 HRESULT 描述 msdn.microsoft.com/en-us/library/windows/desktop/… 您的情况下的设施代码是 FACILITY_ITF 这意味着 &H214 是特定于接口的错误,它没有在您使用的接口之外定义。只需查看返回值部分下的 QueryStateVariable 文档 (msdn.microsoft.com/en-us/library/windows/desktop/…)。在 SDK 检查UPnP.h 文件,你有#define UPNP_E_DEVICE_ERROR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0214) Bingo!
  • @wqw 感谢您的帮助,我已经阅读了所有这些 btu 的不足之处,阅读了 UPNP_E_DEVICE_ERROR 上的描述,它非常通用,说它与运输无关,但只是设备无法返回结果。我不确定从这里去哪里,或者我应该跟进什么来找出解决方案。我查看了 upnp.h 参考和来源,这里没有提到 214,我做了一个ctrl+f 在两个页面上都显示“0 个匹配项”。我应该在这一页上减少损失还是你认为它可以修复?
  • @wqw 我现在找到了正确的源文件,我可以看到描述以及 HRESULT 错误是如何引发和组合的,但是该错误非常普遍,没有提供后续跟进的线索,我将继续弄乱代码,看看我是否可以从中按摩出一些东西,但如果有人对摆脱这个有任何想法(我已经从里到外阅读了 msdn upnp 文档),我完全听好了:)。
  • 也许这个错误是一种复杂的方式来表示当前设备的“变量未定义”。完全跳过它或返回 Empty/Null 以向 UI 表示“值为 N/A”。

标签: c# vb.net visual-studio vb6 upnp


【解决方案1】:

我认为您已经找到的文档说得很清楚:

变量未发生事件,远程查询返回错误 代码。 ... 此方法从 服务对象的本地缓存。缓存包含每个值 在最后一个事件通知中指示的变量。

快速查看InternetGateway.WANIPConnection 的 UPnP 规范可以确认您失败的变量确实没有发生。这意味着“服务对象的本地缓存”不能包含这些变量的任何值。设备根本没有提供任何东西。 您成功获取的变量只是事件变量

微软文档甚至在“备注”部分说:

UPnP 论坛不鼓励使用这种方法。如果可能,请使用 一项特定于服务的操作(如果已提供)。

“服务特定操作”主要命名为“Get[TheVariableName]”。我不熟悉这个特定的 SCPD,但再次快速查看 UPnP 规范会得出:

ConnectionType = GetConnectionTypeInfo
ExternalPort,InternalClient,InternalPort = GetGenericPortMappingEntry
LastConnectionError = GetStatusInfo

等等

【讨论】:

  • 感谢您的输入,根据我收集的信息(正如您所说),变量已过时,执行操作是获取这些变量值的新/首选标准。因此,新的 UPnP 规范不鼓励在操作替换时使用局部变量。如果我在任何地方错了,请纠正我。赞成并接受,再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2023-04-01
  • 2010-11-03
  • 2019-09-28
  • 1970-01-01
  • 2021-03-08
相关资源
最近更新 更多