2010-10-26 24 views
0

基本上,當我使用vb.net或c#.net來做到這一點,它完美的作品,但是當我使用vb6,它不起作用,在我的for循環中相關設備中的相關服務被捕獲,在這裏是返回任何結果的代碼...使用UPnP獲取IP地址InvokeAction不返回任何內容,有幫助嗎?

 ' 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相關的東西的作品,即:retreiving設備列表和獲取在每個設備的服務等...沒有probs,只是InvokeAction似乎沒有對我嘗試使用的服務工作它上(這是"WANIPConnection:1"類型的在型"WANConnectionDevice:1"的裝置)...

這裏作參考的接口的細節:http://msdn.microsoft.com/en-us/library/aa382237(VS.85).aspx

我試圖讓從InvokeAction的返回值(其被示出爲最後一個參數在我剛剛提供的鏈接的接口聲明中,主要針對C/C++用戶,在.NET和VB6中,最後一個參數是返回值),甚至是cou如果需要的話,我可以提供代碼,但我很樂意直接運行它,而無需查找返回值,因爲這是由此列表定義的:http://msdn.microsoft.com/en-us/library/aa381160(v=VS.85).aspx和我正在尋找的實際數據應該在xouts數組中,特別是xouts(0),有沒有人有任何可能的線索?

防火牆問題可能嗎?我在提升模式下運行,並且在設備(路由器)上啓用upnp。

更新:vie注意到該操作實際上正在運行/執行,但out參數數組(或VB中的ByRef參數)未被數據更新,這表明markj關於interop問題的評論是一個很好的主角。

回答

1

這很簡單。這些參數旨在是包含具有一個元素的數組變體,索引= 0

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

我已經使用了一段時間,沒有任何問題。

+0

是否有任何理由可以想到爲什麼它不適用於特定的計算機?因爲我看到代碼示例(在VBScript和VB6中)在哪裏工作,而我正在做同樣的事情,但事實並非如此。 +我不是一個業餘程序員,我知道我在做什麼,但它完全擺脫了我爲什麼對我挑剔。嘗試新的項目在vb6,不工作,我會嘗試另一臺電腦,但如果你有興趣,我會報告從另一臺電腦我的調查結果。 – 2010-10-30 00:32:40

+0

我想到的唯一情況是,直到XP SP2才支持這個功能,據我所知,我已經在XP SP3上測試了上面的邏輯; Vista Gold,SP1和SP2;和Windows 7.Windows計算機必須安裝UPnP基礎結構,軟件防火牆必須允許流量通過,並且NAT設備必須啓用UPnP。 XP版本的UPnP.dll中有不完整的Type信息,但仍然可以使用VBScript回調來獲得UPnP功能的這個子集。我不知道爲什麼它不適合你。 – Bob77 2010-10-30 01:10:15

+0

這裏有一個簡單的工作示例,可能值得一看:http://www.vbforums.com/showthread.php?t=592823 – Bob77 2010-10-30 01:13:10

1

您鏈接的文件說,心的和xouts應該是調用一個空數組:你可以嘗試改變定義

Dim xins() As Variant 
Dim xouts() As Variant 

如果不工作,你甚至可以嘗試

Dim xins As Variant 
Dim xouts As Variant 
+0

@MarkJ,感謝您的留言。我已經嘗試過他們兩個,但只是爲了確保,我已經在你的帖子和第一個建議產生了「無效過程調用」並且第二個聲明方法導致了「類型不匹配」,在InvokeAction行上再次嘗試了它們。我發現它確實需要一個尺寸正確的數組,但它只是不會返回xouts數組中的結果,甚至不會拋出異常......您怎麼看? – 2010-10-27 09:57:38

+0

@Erx_VB超越了我。理想情況下,我認爲我們需要一位COM專家來研究這個問題,我想他們都沒有注意到這個問題。我認爲VB6不支持所有可能的COM SAFEARRAY變體,這可能是問題所在。你可以看看Matt Curland的書* Advanced Visual Basic 6 Power Techniques *。它是[免費在線](http://www.scribd.com/doc/35223728/Advanced-Visual-Basic-6-Power-Techniques-for-Everyday-Programs-9780201707120-24922),並有一些很好的高級討論SAFEARRAYS。或者,您可以在VB.Net/C#中創建自己的包裝,並使其可見COM ... – MarkJ 2010-10-27 12:31:07

+0

感謝您提供的信息,您認爲這可以通過自定義.tlb文件並引用它來解決,或者您認爲它比這更深。目前我正在使用.tlb在vb6中使用這個DLL來刪除無符號長整型,並使其成爲vb理解的正常長。 – 2010-10-27 12:54:02