#ruby #winapi
#ruby #winapi
Вопрос:
Я тестирую win32api ruby. Я сталкиваюсь с двумя проблемами:-
-
Я понимаю основную концепцию, пытаюсь работать с Ruby. Иногда я получаю ошибку сегментации. Это потому, что тип параметра (который я указываю в new) не соответствует фактическому определению функции? Это, безусловно, соответствует этому наблюдению, но я не уверен. Хотел получить подтверждение от кого-нибудь.
-
API, который я пытаюсь использовать, взят из wlanapi.dll (http://msdn.microsoft.com/en-us/library/ms706759(v=vs.85).aspx ) . Мне нужно автоматизировать подключения Wi-Fi с моего компьютера с Windows для тестирования. Как вы можете видеть, функция имеет как параметры _out, так и возвращаемое значение. Я хотел знать, какое из них соответствует «экспорту» определения новой функции win32api (http://www.rubycentral.com/pickaxe/lib_windows.html ) . Я думал, что это фактическое возвращаемое значение, т. Е. успех или одно из сообщений об ошибке. В таком случае, как мне получить другие параметры _out, такие как дескриптор, мне нужно использовать этот дескриптор для других функций.
Спасибо и с уважением
Ответ №1:
Поскольку вы не опубликовали свой вызов, я бы мог только догадываться, но да, возможно, что ошибка сегментации возникла из-за недопустимого Win32API.new
вызова. Это определяет структуру вызова.
Я не знаком с этой функцией, но, просто взглянув на определение в MSDN, я полагаю, что допустимым вызовом к ней было бы следующее (при условии, что используется 32-разрядная платформа с 4-байтовыми указателями). Первые два параметра здесь определены как 32-разрядные целые числа без знака с символом ‘L’. Второй фактически обрабатывается API как указатель, но должен быть нулевым, поэтому передача нуля должна быть приемлемой для этого. Последние два параметра являются указателями. ‘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')}"