Module: WindowsCOM::COMInterface_

Defined in:
lib/windows_com/common.rb

Class Method Summary collapse

Class Method Details

.[](vtbl, siid) ⇒ Object



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) # prepend *this* ptr for FFI func call


        STDERR.puts [:vt_call, self.class, name, args].inspect if
          WINDOWS_COM_TRACE_CALL_ARGS

        @vtbl[name].call(*args)
      }
    }
  }
end