2011-04-05 42 views
0

我正在嘗試使用ruby的win32api。我面臨兩個問題: -ruby​​ win32api關於導出和返回值的問題

  1. 我明白基本概念,試圖用Ruby來工作。我有時會遇到分段錯誤。是否因爲參數類型(我在新指定的)與實際的函數定義不匹配?這當然對應於那個觀察,但我不確定。希望得到某人的確認。

  2. 我想要的API是來自wlanapi.dll(http://msdn.microsoft.com/en-us/library/ms706759%28v=vs.85%29.aspx)。我需要從我的Windows機器上進行無線連接的自動測試。正如你所看到的,這個函數有_out參數和一個返回值。我想知道哪些對應於win32api新函數定義(http://www.rubycentral.com/pickaxe/lib_windows.html)的「導出」。我認爲這是實際的返回值,即成功或錯誤消息之一。在那種情況下,我如何獲得像句柄這樣的其他_out參數,我需要爲其他函數使用此句柄。

感謝和問候

回答

0

既然你沒有張貼你的電話,我就只能是猜測,但是是有可能的是,分段錯誤將來自無效Win32API.new電話。這定義了調用的結構。

我不熟悉的功能,但只是在看MSDN上的定義,我認爲以下將是一個有效的調用(假設32位平臺有4個字節的指針)。這裏的前兩個參數被定義爲帶有'L'的32位無符號整數。第二個實際上被API看作一個指針,但應該是NULL,所以傳遞一個零應該可以。最後兩個參數是指針。 'I'表示一個整數返回值。

negver = [0].pack('L')創建充當接收4字節協商版本值的指針4字節「串」。在實際的通話中,我並不完全確定第一個參數;您可能需要根據自己的環境進行調整。

api = Win32API.new('wlanapi', 'WlanOpenHandle', ['L', 'L', 'P', 'P'], 'I') 
negver = [0].pack('L') 
handle = [0].pack('l') # this assumes 4 byte pointer 
ret = api.call(2, 0, negver, handle) 
puts "WlanOpenHandled returned #{ret}" 
puts "Negotiated version: #{negver.unpack('L')}, Handle is #{handle.unpack('L')}"