124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
# File 'lib/windows_com/common.rb', line 124
def self.[](vtbl, siid)
Class.new {
const_set :Vtbl, vtbl
const_set :IID, WindowsCOM::GUIDFromString(siid)
def initialize(pointer)
@vptr = COMVptr_.new(pointer)
@vtbl = self.class::Vtbl.new(@vptr[:lpVtbl])
end
attr_reader :vptr, :vtbl
self::Vtbl.members.each { |name, sig|
define_method(name) { |*args|
hresult = @vtbl[name].call(@vptr, *args)
raise "#{self}.#{name} failed (hresult: #{format('%#08x', hresult)})" if
WindowsCOM::FAILED(hresult)
hresult
}
}
}
end
|