Поскольку вы не публиковали свой вызов, я бы только догадывался, но да, возможно, ошибка сегментации возникнет из-за неправильного вызова Win32API.new
.Это определяет структуру звонка.
Я не знаком с этой функцией, но, просто взглянув на определение в MSDN, я полагаю, что следующий будет правильным вызовом (при условии 32-битной платформы с 4-байтовыми указателями).Первые два параметра здесь определены как 32-разрядные целые числа без знака с 'L'.Второй фактически обрабатывается 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')}"