Вероятная причина, по которой он вызывает ошибку seg, заключается в том, что где-то под Win32API
отсутствие аргументов приводит к одному или нескольким разыменованиям NULL-указателей.
Если вы собираетесь создавать подобные функции, то вам следует рассмотреть возможность добавленияблок проверки (или лямбда-выражения) аргумента для вызова api-call, boolean-return в качестве аргумента def_api
, который вы затем вызываете в качестве первой части вашей производной функции.Примерно так:
def self.def_api(function, parameters, return_value, &valid_args?)
api = Win32API.new 'user32', function, parameters, return_value
define_method(function.snake_case) do |*args|
if valid_args? and valid_args?.call(*args)
api.call *args
else
// raise argument error, etc
end
end
end
Затем
def_api 'FindWindow', ['P', 'P'], 'L', { |args| return true if // API specific checks succeed }
ОБНОВЛЕНИЕ: добавление большего количества цвета по запросу спрашивающего
&valid_args?
- это имя параметра блока.Префикс амперсанда (&) - это то, как вы сообщаете ruby, что проходите блок.Вы можете передать только один блок методу, и он должен быть последним параметром в списке аргументов.Суффикс вопросительного знака (?) - это просто соглашение в программировании на Ruby для именования функций, которые возвращают логические значения.
Если передан блок, вы вызываете его с помощью &block.call(args)
Для вызова методас аргументом блока вы делаете что-то вроде этого:
method { |args| // block implementation }
или
method do |args|
// block implementation
end
args
передается в блок через call method
.Надеюсь, это поможет.