1

[虽然我在下面使用 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 的软件并复制/粘贴他们的错误日志时遇到错误。不是程序员报告错误号并寻求帮助并获得解决方案或答案(本来会很棒)。

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

UPNP_E_DEVICE_ERROR 的定义:

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

.

.

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

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

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

[注意避免混淆:我在检索到的值周围放置星号(

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

设置uDevice(当前设置的设备)为:WAN Connection Device,NETGEAR WNR1000v3 N150 Wireless Router,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 次(共 1 次)尝试完成 GetQSV(用于 PortMappingEnabled)。QSV 的长度为 0(长度检查失败)。返回值为**(非空)。[-2147220972] 对象 'IUPnPService' 的方法 'QueryStateVariable' 失败 LastDllError: 0

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

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

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

在 1 次(共 1 次)尝试中完成 GetQSV(对于 PossibleConnectionTypes)。QSV 的长度为 9(大于 0)。返回值为 *IP_Routed*(非空)。

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

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

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

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

设置uDevice(当前设置的设备)为:WAN Connection Device,NETGEAR WNR1000v3 N150 Wireless Router,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 (of 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 次(共 1 次)尝试完成 GetQSV(用于 PortMappingEnabled)。QSV 的长度为 0(长度检查失败)。返回值为**(非空)。[-2147220972] 对象 'IUPnPService' 的方法 'QueryStateVariable' 失败 LastDllError: 0

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

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

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

在 1 次(共 1 次)尝试中完成 GetQSV(对于 PossibleConnectionTypes)。QSV 的长度为 9(大于 0)。返回值为 *IP_Routed*(非空)。

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

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

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

4

1 回答 1

2

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

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

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

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

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

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

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

等等

于 2012-09-03T14:00:06.923 回答