184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
# File 'lib/windows_com/common.rb', line 184
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
def to_ptr
@vptr.pointer
end
self::Vtbl.members.each { |name, sig|
define_method(name) { |*args|
args.unshift(@vptr)
STDERR.puts [:vt_call, self.class, name, args].inspect if
WINDOWS_COM_TRACE_CALL_ARGS
@vtbl[name].call(*args)
}
}
}
end
|