1

[以下では VB6 を使用していますが、VB.NET または C# の両方で記述できるため、喜んでソリューションを受け入れます]

1 つの引数 (値を取得する変数の名前を説明する文字列) のみを取る関数 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 Service には 17 個の変数があるため、それらすべてを試してログに記録しました (成功した試行は 4 回だけで、残りはランタイム エラーです)。 19 個の状態変数 (WanIPConnection より 2 つ多いだけ)。私は 19 回すべての変数取得の試行を試み (そしてログに記録し)、成功した値の戻り値を 4 つしか受け取りませんでした (他のすべては実行時エラーになります)。

これが私のログです。実際の IP アドレスが変更されました (変更しないと炎上することがわかっているためです笑)。現在設定されているデバイスとサービスは、2 つのログのそれぞれの先頭に示されています。は:

[混乱を避けるための注意:取得した値の周りに星の記号 ( ) を配置して、空白を視覚化します。StackOverflow は、内容をイタリック体に変換したり、その間の文字列が空の場合は星をそのままにしたりします]*

最初のログ (WanIPConnection、17 個の状態変数):

uDevice (現在設定されているデバイス) を次のように設定します: WAN 接続デバイス、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 以上) です。戻り値はConnected (Not Null) です。

1 回 (1 回中) の試行で GetQSV (ConnectionType 用) を完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (ExternalIPAddress 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さは 13 (0 以上) です。戻り値は110.122.16.83 (非 Null) です。

GetQSV (ExternalPort 用) を 1 回 (1 回中) 試行しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (InternalClient 用) を 1 回 (1 回中) 試行しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (InternalPort 用) を 1 回 (1 回中) 試行しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (LastConnectionError の場合) を 1 回 (1 回) の試行で完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

1 回 (1 回中) の試行で GetQSV (NATEnabled 用) を完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PortMappingDescription 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PortMappingEnabled 用) を 1 回 (1 回) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PortMappingLeaseDuration 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PortMappingNumberOfEntries 用) を 1 回 (1 回) 試行して完了しました。QSV の長さは 1 (0 以上) です。戻り値は2 (非 Null) です。

GetQSV (PortMappingProtocol 用) を 1 回の試行で完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PossibleConnectionTypes 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さは 9 (0 以上) です。戻り値は *IP_Routed* (非 Null) です。

GetQSV (RemoteHost 用) を 1 回 (1 回中) 試行しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (RSIPAvailable の場合) を 1 回 (1 回) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (稼働時間) を 1 回 (1 回中) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

2 番目のログ (WanPPPConnection、19 個の状態変数):

uDevice (現在設定されているデバイス) を次のように設定します: WAN 接続デバイス、NETGEAR WNR1000v3 N150 ワイヤレス ルーター、urn:schemas-upnp-org:device:WANConnectionDevice:1

uService (現在設定されているサービス) を次のように設定します: urn:schemas-upnp-org:service:WANPPPConnection:1

GetQSV (DownstreamMaxBitRate 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (UpstreamMaxBitRate 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

1 回 (1 回中) の試行で GetQSV (ConnectionStatus 用) を完了しました。QSV の長さは 9 (0 以上) です。戻り値はConnected (Not Null) です。

1 回 (1 回中) の試行で GetQSV (ConnectionType 用) を完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (ExternalIPAddress 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さは 13 (0 以上) です。戻り値は110.122.16.83 (非 Null) です。

GetQSV (ExternalPort 用) を 1 回 (1 回中) 試行しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (InternalClient 用) を 1 回 (1 回中) 試行しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (InternalPort 用) を 1 回 (1 回中) 試行しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (LastConnectionError の場合) を 1 回 (1 回) の試行で完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

1 回 (1 回中) の試行で GetQSV (NATEnabled 用) を完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PortMappingDescription 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PortMappingEnabled 用) を 1 回 (1 回) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PortMappingLeaseDuration 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PortMappingNumberOfEntries 用) を 1 回 (1 回) 試行して完了しました。QSV の長さは 1 (0 以上) です。戻り値は2 (非 Null) です。

GetQSV (PortMappingProtocol 用) を 1 回の試行で完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (PossibleConnectionTypes 用) を 1 回 (1 回中) 試行して完了しました。QSV の長さは 9 (0 以上) です。戻り値は *IP_Routed* (非 Null) です。

GetQSV (RemoteHost 用) を 1 回 (1 回中) 試行しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (RSIPAvailable の場合) を 1 回 (1 回) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

GetQSV (稼働時間) を 1 回 (1 回中) 試行して完了しました。QSV の長さが 0 です (長さチェックの失敗)。戻り値は ** (非 Null) です。[-2147220972] オブジェクト「IUPnPService」のメソッド「QueryStateVariable」が失敗しました LastDllError: 0

4

1 に答える 1

2

あなたがすでに見つけたドキュメントはかなり明確に語っていると思います:

変数はイベント処理されず、リモート クエリはエラー コードを返しました。... このメソッドは、サービス オブジェクトのローカル キャッシュからイベント変数の値を取得します。キャッシュには、最後のイベント通知で示された各変数の値が含まれています。

の UPnP 仕様をざっと見てみるInternetGateway.WANIPConnectionと、失敗している変数が実際には evented ではないことが確認されます。つまり、「サービス オブジェクトのローカル キャッシュ」には、これらの変数の値を含めることはできません。デバイスは何も提供しませんでした。取得に成功している変数はイベント化されたものだけです

Microsoft doc には、「備考」セクションにも次のように記載されています。

UPnP フォーラムは、この方法の使用を推奨していません。可能であれば、サービス固有のアクションが提供されている場合はそれを使用します。

「サービス固有のアクション」は、主に「Get[TheVariableName]」という名前です。私はこの特定の SCPD に精通していませんが、UPnP 仕様をもう一度簡単に調べると、次のようになります。

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

于 2012-09-03T14:00:06.923 に答える