C# 使用UPnP InvokeAction获取IP地址不返回任何内容,帮助?

C# 使用UPnP InvokeAction获取IP地址不返回任何内容,帮助?,c#,.net,com,vb6,interop,C#,.net,Com,Vb6,Interop,基本上,当我使用vb.net或c#.net来实现这一点时,它工作得很好,但当我使用vb6时,它不工作,在捕获相关设备中相关服务的for循环中,下面是不返回结果的代码 ' serv is properly declared and instantiated by the for loop. Dim xins(0) Dim xouts(0) MsgBox ("Starting..." & serv.ServiceTypeIdentifier

基本上,当我使用vb.net或c#.net来实现这一点时,它工作得很好,但当我使用vb6时,它不工作,在捕获相关设备中相关服务的for循环中,下面是不返回结果的代码

      ' serv is properly declared and instantiated by the for loop.
      Dim xins(0)
      Dim xouts(0)

      MsgBox ("Starting..." & serv.ServiceTypeIdentifier & vbCrLf & serv.id & vbCrLf & serv.LastTransportStatus) ' all this shows correctly.

      serv.InvokeAction "GetExternalIPAddress", xins, xouts

      MsgBox (xouts(0)) ' this should print the ExternalIP, but prints an empty string.
基本上,xouts(0)应该包含IP地址,但它不包含(而是一个空字符串,不会引发错误或异常)

所有其他与upnp.dll相关的东西都可以工作,例如:检索设备列表和获取每个设备中的服务等等。。。没问题,只是InvokeAction在我试图使用它的服务上似乎不起作用(在类型为
“WANConnectionDevice:1”
的设备中,它的类型为
“WanConnection:1”

以下是接口详细信息,供参考:

我试图从InvokeAction获取返回值(这是我刚才提供的链接中接口声明中的最后一个参数,主要针对C/C++用户,在.NET和VB6中,最后一个参数是返回值),但甚至无法实现,如果需要,可以提供我如何实现的代码,但我很乐意直接运行它,而不查找返回值,因为这里的列表刚刚定义了返回值:我要查找的实际数据应该在xouts数组中,特别是xouts(0),有人知道这可能是什么吗

可能是防火墙问题?我在提升模式下运行,upnp在设备(路由器)上启用


更新:vie注意到操作实际上正在运行/执行,但out参数数组(或VB中的ByRef参数)没有使用数据更新,这表明markj对互操作问题的评论是一个很好的线索。

您链接的文档说,调用xins和xouts时应该是一个空数组:您可以尝试将定义更改为

Dim xins() As Variant
Dim xouts() As Variant
如果这不起作用,你甚至可以试试

Dim xins As Variant
Dim xouts As Variant

这很简单。这些参数是包含一个数组的变量,该数组只有一个元素,索引=0

Dim xins As Variant, xouts As Variant
:
:
ReDim xins(0), xouts(0)
serv.InvokeAction "GetExternalIPAddress", xins, xouts
MsgBox xouts(0)

我已经用了一段时间了,没有问题。

@MarkJ,谢谢你的帖子。我以前尝试过这两种方法,但只是为了确保,在您的帖子和第一个提示生成了“无效过程调用”,第二个声明方法导致了“类型不匹配”之后,我再次尝试了这两种方法,这两种方法都在InvokeAction行。我看到它确实需要一个适当尺寸的数组,但它只是不在xouts数组中返回结果,甚至不抛出异常。。。你觉得怎么样?@Erx_VB我无法理解。理想情况下,我认为我们需要一位COM专家来研究这个问题,我想他们都没有注意到这个问题。我认为VB6不支持COM SAFEARRAY的所有可能变体,这可能就是问题所在。你可以看看Matt Curland的书Advanced Visual Basic 6 Power Technologies。它是,并且对安全阵列进行了一些很好的高级讨论。或者,您可以在VB.Net/C#中创建自己的包装器,并使其COM可见……感谢您提供的信息,您认为这可以通过自定义.tlb文件并引用该文件来解决吗?或者您认为它的种子比这要深得多。目前,我正在使用.tlb在vb6中使用此dll来删除未签名的long,并使其成为vb能够理解的正常long。@Erx_vb我真的不知道是否可以通过自定义.tlb文件来解决它。我不知道到底是什么问题。@Erx_VB我刚刚注意到你用一个更一般的标题再次提出了这个问题。通常这是不赞成的,但在这种情况下,我认为这是一个狡猾的计划!我对你的建议投了更高的票,希望有知识渊博的人过来回答!你有没有任何理由能想到为什么它对一台特定的计算机不起作用?因为我看到代码示例(在vbscript和vb6中)在哪里工作,我正在做同样的事情,但它没有+我不是一个业余程序员,我知道我在做什么,但我完全不明白为什么对我如此挑剔。在vb6中尝试了新项目,不起作用,但我会尝试另一台计算机,如果您感兴趣,我会在另一台计算机上报告我的发现。我想到的唯一一件事是,在XP SP2之前,这是不受支持的。我已经在xpsp3上测试了上面这样的逻辑;Vista Gold、SP1和SP2;以及视窗7。Windows计算机必须安装UPnP基础设施,软件防火墙必须允许流量通过,NAT设备必须启用UPnP。UPnP.dll的XP版本中存在不完整的类型信息,但您仍然可以使用VBScript回调使UPnP功能的子集正常工作。我不知道为什么它对你不起作用。这里有一个简单的工作示例可能值得一看:Bob,我在另一台计算机上进行了测试,结果恐怕是一样的,空byref out参数返回空值的方式与我在初始测试中所做的方式完全相同,action仍然执行,但不返回任何数据。这也是Windows7。你认为upnp需要在某个地方的计算机上启用吗?我认为只有设备需要启用upnp,windows上的upnp.dll需要注册并工作,就这样。您认为呢?您需要在PC(网络和共享中心)中打开网络发现,软件防火墙必须允许它通过,路由器需要启用UPnP。