175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
# File 'lib/windows_com/common.rb', line 175
def self.[](vtbl, siid)
Class.new {
const_set :Vtbl, vtbl
const_set :IID, WindowsCOM::GUID[siid]
def initialize(pointer)
@vptr = WindowsCOM::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
|