【发布时间】: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